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

Go 語言之父介紹泛型

開發
泛型是 Go 1.18 的重要新語言特性,Robert Griesemer 和 Ian Lance Taylor 表示,這個功能實現得很好并且質量很高。雖然他們鼓勵在有必要的場景中使用泛型,但在生產環境中部署泛型代碼時,請務必謹慎。

Go 官方博客近日發表了一篇介紹新特性“泛型”的文章,作者是兩位重量級人物 —— Robert Griesemer 和 Ian Lance Taylor,內容基于他們在 2021 年 GopherCon 大會上的演講。

▲ 左:Go 語言設計者之一 Robert Griesemer;右:Go 泛型主要設計者 Ian Lance Taylor

不久前正式發布的 Go 1.18 添加了對泛型的支持,據稱泛型是 Go 開源以來所做的最大改變。泛型是一種編程范式,這種范式獨立于所使用的特定類型,泛型允許在函數和類型的實現中使用某個類型集合中的任何一種類型。

泛型為 Go 添加了三個新的重要內容:

  • 面向函數和類型的“類型形參” (type parameters)
  • 將接口類型定義為類型集合,包括沒有方法的接口類型
  • 類型推斷:在大多數情況下,在調用泛型函數時可省略“類型實參” (type arguments)

Type Parameters

現在函數和類型都具有類型形參” (type parameters),類型形參列表看起來就是一個普通的參數列表,除了它使用的是方括號而不是小括號。

先從浮點值的基本非泛型 Min 函數開始:

func Min(x, y float64) float64 {
if x < y {
return x
}
return y
}

通過添加類型形參列表來使這個函數泛型化——使其適用于不同的類型。在此示例中,添加了一個帶有單個類型形參T的類型參數列表,并替換了float64。

import "golang.org/x/exp/constraints"
func GMin[T constraints.Ordered](x, y T) T {
if x < y {
return x
}
return y
}

然后就可以使用類型實參調用此函數:

x := GMin[int](2, 3)

向GMin提供類型參數,在這種情況下int稱為實例化。實例化分兩步進行。首先,編譯器在泛型函數或泛型類型中用所有類型形參替換它們各自的類型實參。然后,編譯器驗證每個類型形參是否滿足各自的約束。如果第二步失敗,實例化就會失敗并且程序無效。

成功實例化后,即可產生非泛型函數,它可以像任何其他函數一樣被調用。比如:

fmin := GMin[float64]
m := fmin(2.71, 3.14)

GMin[float64]的實例化產生了一個與Min函數等效的函數,可以在函數調用中使用它。類型形參也可以與類型一起使用。

type Tree[T interface{}] struct {
left, right *Tree[T]
value T
}

func (t *Tree[T]) Lookup(x T) *Tree[T] { ... }

var stringTree Tree[string]

在上面的例子中,泛型類型Tree存儲了類型形參T的值。泛型類型也可以有方法,比如本例中的Lookup。為了使用泛型類型,它必須被實例化;Tree[string]是使用類型實參string來實例化Tree的示例。

類型推斷

此項功能是最復雜的變更,主要包括:

  • 函數參數類型推斷 (Function argument type inference)
  • 約束類型推斷 (Constraint type inference)

雖然類型推斷的工作原理細節很復雜,但使用它并不復雜:類型推斷要么成功,要么失敗。如果它成功,類型實參可以被省略,調用泛型函數看起來與調用普通函數沒有什么不同。如果類型推斷失敗,編譯器將給出錯誤消息,在這種情況下,只需提供必要的類型實參。

泛型是 Go 1.18 的重要新語言特性,Robert Griesemer 和 Ian Lance Taylor 表示,這個功能實現得很好并且質量很高。雖然他們鼓勵在有必要的場景中使用泛型,但在生產環境中部署泛型代碼時,請務必謹慎。

本文轉自OSCHINA

本文標題:Go 語言之父介紹泛型

本文地址:https://www.oschina.net/news/188448/intro-go-generics

資訊來源:https://go.dev/blog/intro-generics

責任編輯:未麗燕 來源: 開源中國
相關推薦

2021-10-18 10:53:26

Go 代碼技術

2024-10-28 00:40:49

Go語法版本

2021-01-13 10:52:29

C語言Linux計算機領域

2024-01-05 20:46:14

2021-09-29 18:17:30

Go泛型語言

2024-01-08 08:23:07

Go語言代碼

2022-04-15 09:55:59

Go 泛型Go 程序函數

2011-10-19 13:41:02

JavaC語言丹尼斯·里奇

2011-10-19 13:38:41

Java

2020-12-31 09:06:44

Go語言Reflect

2023-07-21 14:20:03

ChatGPT神經網絡

2021-10-23 06:42:14

Go語言接口

2021-10-03 22:18:14

Go語言整數

2021-01-14 05:20:48

Go語言泛型

2011-10-20 13:09:19

JavaC

2022-05-06 09:22:25

Go泛型

2017-11-27 11:08:33

編程C語言代碼

2021-10-16 17:53:35

Go函數編程

2021-10-09 07:52:01

Go程序重命名

2011-05-31 13:41:00

C語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久99| 国产一级免费在线观看 | 五月天天丁香婷婷在线中 | 狠狠干美女 | 波多野结衣一区二区 | 天天爽天天操 | 日日碰狠狠躁久久躁96avv | 六月色婷 | 午夜免费视频 | 欧美伦理一区 | 久久精品播放 | 色综合99| 亚洲成人天堂 | 欧美一级欧美一级在线播放 | 羞羞网站免费 | 黄色大片在线免费观看 | 在线中文字幕av | 夜夜夜久久久 | 在线观看精品 | 日韩激情视频一区 | 懂色tv | 国产欧美日韩精品一区 | 天堂资源最新在线 | 国产成人精品午夜视频免费 | 久久精品国产一区老色匹 | 成人免费看黄 | 二区三区在线观看 | 精品日韩一区二区三区 | 一级毛片播放 | 亚洲午夜精品一区二区三区他趣 | 99久久婷婷国产综合精品电影 | 日本特黄特色aaa大片免费 | 精品一区二区三区四区在线 | 91精品国产91久久久久久吃药 | 国产欧美一区二区三区久久人妖 | 91大片 | 国产精品美女久久久久久免费 | 91成人精品 | 国产精品一区二区av | 亚洲精品小视频在线观看 | 久久久久久亚洲 |