日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go1.18新特性

發布時間:2024/8/23 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go1.18新特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

最近突然發現golang更新版本1.18了, 于是迫不及待的來看看這個版本加了些什么新特性. 沒準就有之前困擾很久的問題, 在新版本被官方解決了呢.

先簡單概述一下都有些什么變化, 后面再細說:

  • 增加泛型的支持
  • 系統庫方法增加
  • 修復 bug
  • 另外, 像"系統內核更新"這種, 我們在實際開發中根本就無需關心的內容, 我就沒有列出, 完整更新內容到官網去看吧. 1.18版本的官方說明鏈接: https://golang.google.cn/doc/go1.18

    其實, 整個看下來, 最大的變動就是增加了泛型的支持. 可以說是千呼萬喚始出來了. 主要就看看這個泛型唄. 有需要的快升級了, 官方的說法是, 完全向后兼容.

    泛型

    還記得在這之前, 要寫一個返回二者最小值的min函數, 我們是怎么做的呢?

    /* 方案一 每個類型都添加一個方法 */ func minInt(a, b int) int {if a < b {return a} else {return b} }func minInt64(a, b int64) int64 {if a < b {return a} else {return b} }// ... 其他類型的方法/* 方案二 通過 interface 接收參數并返回 */ func min(a, b interface{}) interface{} {changeToFloat64 := func(v interface{}) float64 {if vInt64, ok := v.(int64); ok {return float64(vInt64)} else if vInt32, ok := v.(int32); ok {return float64(vInt32)} else if vInt, ok := v.(int); ok {return float64(vInt)} else if vFloat32, ok := v.(float32); ok {return float64(vFloat32)} else if vFloat64, ok := v.(float64); ok {return vFloat64} else { // 其他類型判斷return 0}}floatA := changeToFloat64(a)floatB := changeToFloat64(b)if floatA < floatB {return floatA} else {return floatB} }

    而這兩種實現方式都存在其不足.

    方案一(多個方法的實現), 其問題在于將相同的邏輯在所有方法中都重復實現了一遍, 同時每個類型的函數名都不一樣, 也增加了函數調用的難度.

    方案二(通過判斷類型), 這樣確實將大小比較的邏輯放到一起來, 但返回值也變成interface了, 函數的調用方接到返回時還需要進行一次轉型.

    而有了泛型之后, 函數就可以這樣寫了:

    func minNew[T int|float32](a, b T) T {if a < b {return a} else {return b} }

    是不是簡潔很多了. 在線運行

    相信你也注意到了, 上面函數中有這樣一段內容[T int|float32]. 這段是對T這個泛型的約束, 指定這個泛型具有哪些特性的.如果在上面的約束中加上interface那就回報錯了, 因為interface是無法進行大小比較的.

    泛型及其約束的使用方式如下:

    // any 同 interface{} type anyDemo[T any] []T // comparable 用來標識所有可以使用 ==/!= 進行比較的類型 type anyDemo[T comparable] []T // 限制泛型 T 為 int|int32|float32 其中一個 type anyDemo[T int|int32|float32] []T /* 約束前添加 "~"符合, 意為底層類型 例如定義類型: type myInt int myInt 類型變量底層類型為 int, 但仍然是兩個不同的類型 若泛型約束為 int, 那么就不能接受 myInt 類型的變量 而泛型約束為 ~int, 就可以接受 myInt 類型的變量*/ type anyDemo[T ~int|int32] []T// 泛型類型定義方法 func (m *anyDemo[T]) Push(v T) *anyDemo[T] {*m = append(*m, v)return m } // 方法中使用 func funcDemo[T any](a, b T) T{} // 結構體中使用泛型 type structDemo[T1, T2 any] struct{t1 T1arr []T2 }// 泛型約束也可以通過接口進行定義, 以方便使用 // 定義不同類型的集合 type inter1 interface {~int | ~int8 | ~int16 | ~int32 | ~int64 |~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |~float32 | ~float64 |~string }

    同時也增加了支持泛型的系統庫:

    • goland.org/x/exp/constraints: 對泛型代碼的約束
    • golang.org/x/exp/slices: 切片操作
    • golang.org/x/exp/maps: map 操作

    完了, 就這么點玩意

    總結

    以上是生活随笔為你收集整理的go1.18新特性的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。