成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go1.25 新特性:泛型 Core types 將被放棄!

開發 前端
在 Go1.18 版本發布了泛型,帶來了:類型參數(type parameters)、類型約束(type constraints)、核心類型(core types)等一大堆泛型帶出來的新概念。引起了一頓新知識的的學習浪潮。

大家好,我是煎魚。

在 Go1.18 版本發布了泛型,帶來了:類型參數(type parameters)、類型約束(type constraints)、核心類型(core types)等一大堆泛型帶出來的新概念。引起了一頓新知識的的學習浪潮。

圖片圖片

最早泛型 2019 年到現在 2025 年差不多也有個 6 年了。

背景

在 Go1.25 的新特性提前宣發中,Go 核心團隊正式發布《Goodbye core types - Hello Go as we know and love it![1]》,要將泛型中的核心類型(core types)給干掉。

圖片圖片

要被畢業的核心類型,又到底是什么呢?

核心類型(Core types)

在 Go 1.18 中,我們引入了 “核心類型[2]”(core type)的概念,以便更容易檢查類型參數的某些約束。

我們先放例子,我覺得例子比起純理論可能更容易理解。

在 Go 官方的《go spec》中,具體包含核心類型的例子:

type Celsius float32
type Kelvin float32

interface{ int }                     // int
interface{ Celsius | Kelvin }        // float32
interface{ ~chanint }               // chan int
interface{ ~chanint | ~chan<- int } // chan<- int
interface {
  ~[]*data
  String() string
 } // []*data

注意:右側注釋就是他所標注的核心類型。

不包含核心類型的例子:

interface{}                           // no single underlying type
 interface{ Celsius | float64 }        // no single underlying type
 interface{ chan int | chan<- string } // channels have different element types
 interface{ <-chan int | chan<- int }  // directional channels have different directions

核心類型的定義如下:

  • 如果某類型 T 的定義是一個類型別名,例如 type T = A,那么 T 的核心類型就是 A 的核心類型。
  • 如果某類型 T 是一個底層類型為某個具體類型的命名類型,那么它的核心類型就是那個底層類型。
  • 如果某類型 T 是一個類型參數,并且其約束指定了一個核心類型(比如 ~int 或 ~[]byte),那么它的核心類型就是那個指定的類型。
  • 否則,該類型沒有核心類型。

為什么不要核心類型了?

雖然引入了核心類型試圖統一泛型語義。

結果卻讓語言規范更復雜、學習門檻更高、規則更難一致,發現最終得不償失。

具體原因如下:

  • 核心類型定義不夠靈活,限制過嚴

比如接口 interface{ ~[]int } 擁有核心類型 []int,但更復雜的接口如 Constraint(即含有方法和多個類型約束的接口)就無法推導出核心類型。

對于 appendcopy、通道操作等語言特性,核心類型定義過于嚴格,實際需要對方向、類型組合做額外處理(例如同時包含 []byte 和 string)。

  • 對語言特性理解造成阻礙:
  • 某些語言特性(如切片表達式)在規范中以“核心類型”為判斷依據,而非更直接地說明“操作數必須是數組、切片或字符串”。
  • 這讓開發者即使寫的不是泛型代碼,也得理解 “核心類型” 的概念,徒增學習負擔。
  • 破壞語言規則的一致性,導致了例外:
  • 有些表達式(如 lencap, 索引表達式等)并不依賴核心類型判斷,導致語言規則看起來像是有一堆例外。
  • 例如社區提案 #48522[3] 中提到的 “對聯合類型元素字段的統一訪問”,如果沒有核心類型這個障礙,其實可以自然落入普通字段訪問規則中,而不是再新增例外。

Go1.25 會做出什么改變?

由于上述提到的一系列導致 Go 更復雜的問題,Go 核心團隊將決定在 Go1.25(2025 年 8 月)的語言規范中將核心類型的概念給移除掉。并給未來預留有需要時將其概念轉為顯式的方式。

#go/issues/70128#go/issues/70128

#go/issues/70128

移除后,將有以下幾個好處:

  • 語言規范更簡潔,易于學習

Go 規范呈現的概念更少,不再引入“核心類型”這種額外抽象。

初學者能更快理解語言的核心結構,不被泛型細節干擾。

  • 非泛型代碼無需了解泛型語義
  • 你寫的是普通代碼,就不需要去理解類型參數、類型約束或核心類型。
  • 泛型不再“污染”對普通語言特性的理解,使 Go 保持其一貫的簡潔直觀。
  • 針對具體操作采用具體規則,更具靈活性
  • 用 “具體規則匹配具體操作” 而非 “一刀切” 的抽象模型,為語言擴展打開了大門。
  • 不僅讓 issue #48522(字段選擇器適用于類型集合)更自然,也為將來支持更強大的切片操作、更智能的類型推導等功能提供空間。

總結

Go 泛型雖然已經發布了 6 年,但目前仍然在持續的迭代過程中。在以往包含核心類型的概念時,泛型確實有一定的學習成本。

在后續的 Go1.25 新版本移除后,雖然有所降低。但是感覺泛型的更好的成熟可用還是有一定的發展空間的。

參考資料

[1] Goodbye core types - Hello Go as we know and love it!: https://go.dev/blog/coretypes

[2] 核心類型: https://go.dev/ref/spec#Core_types

[3] #48522: https://go.dev/issue/48522

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2025-04-29 08:59:37

2025-06-16 08:54:01

macOS模式版本

2025-05-07 08:55:14

GoMap存儲

2025-05-12 08:58:14

GoDWARF5二進制

2025-02-08 11:00:33

2021-09-29 18:17:30

Go泛型語言

2021-01-14 05:20:48

Go語言泛型

2024-12-30 11:05:28

泛型Go類型別名

2021-12-13 08:52:42

Go 泛型

2021-08-09 10:36:20

GoSlices Maps

2014-04-15 16:01:00

Java8泛型

2024-10-28 00:40:49

Go語法版本

2021-09-05 18:25:30

Go命令倉庫

2021-11-27 22:20:13

SlicesGo泛型

2023-11-03 14:02:04

Go切片泛型庫

2022-03-28 13:34:26

Go泛型部署泛型

2025-04-28 05:00:00

2023-11-29 08:19:45

Go泛型缺陷

2016-08-23 09:18:33

UpstartUbuntuSystemd

2009-09-09 14:11:58

Scala泛型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.狠狠干 | 免费视频99| 国产精品成人一区 | 欧美国产91 | 夜夜骚| 日韩国产一区 | 日韩欧美国产一区二区三区 | 久久久久av | 一二三四在线视频观看社区 | 亚洲欧美一区二区三区在线 | 日韩成人在线观看 | 精品一级毛片 | 久久中文网 | 欧美日韩电影一区二区 | 日本一区二区不卡 | 精品国产不卡一区二区三区 | 性欧美hd | 玖玖爱365| 手机看黄av免费网址 | 日日噜噜夜夜爽爽狠狠 | 亚洲女人的天堂 | 国产精品视频网 | 在线观看电影av | 欧美色视频免费 | 欧美二区三区 | 黄视频网站在线 | 欧美精品在线观看 | 日本三级做a全过程在线观看 | 亚洲视频中文字幕 | 久草成人| 国产在线精品一区二区三区 | 午夜av电影 | 久久福利电影 | 久久精品一级 | 久久不卡| 一级毛片在线播放 | 欧美精品在线播放 | 日韩精品一区二区三区中文字幕 | 在线观看亚洲欧美 | 久久亚洲精品国产精品紫薇 | 成人亚洲视频 |