go1.18新特性
前言
最近突然發現golang更新版本1.18了, 于是迫不及待的來看看這個版本加了些什么新特性. 沒準就有之前困擾很久的問題, 在新版本被官方解決了呢.
先簡單概述一下都有些什么變化, 后面再細說:
另外, 像"系統內核更新"這種, 我們在實際開發中根本就無需關心的內容, 我就沒有列出, 完整更新內容到官網去看吧. 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 操作
完了, 就這么點玩意
總結
- 上一篇: linux创建新进程就分配空间,linu
- 下一篇: mysql 查询 带数据库实例_数据库查