自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go 語(yǔ)言之父介紹泛型

開(kāi)發(fā)
泛型是 Go 1.18 的重要新語(yǔ)言特性,Robert Griesemer 和 Ian Lance Taylor 表示,這個(gè)功能實(shí)現(xiàn)得很好并且質(zhì)量很高。雖然他們鼓勵(lì)在有必要的場(chǎng)景中使用泛型,但在生產(chǎn)環(huán)境中部署泛型代碼時(shí),請(qǐng)務(wù)必謹(jǐn)慎。

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

▲ 左:Go 語(yǔ)言設(shè)計(jì)者之一 Robert Griesemer;右:Go 泛型主要設(shè)計(jì)者 Ian Lance Taylor

不久前正式發(fā)布的 Go 1.18 添加了對(duì)泛型的支持,據(jù)稱泛型是 Go 開(kāi)源以來(lái)所做的最大改變。泛型是一種編程范式,這種范式獨(dú)立于所使用的特定類(lèi)型,泛型允許在函數(shù)和類(lèi)型的實(shí)現(xiàn)中使用某個(gè)類(lèi)型集合中的任何一種類(lèi)型。

泛型為 Go 添加了三個(gè)新的重要內(nèi)容:

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

Type Parameters

現(xiàn)在函數(shù)和類(lèi)型都具有類(lèi)型形參” (type parameters),類(lèi)型形參列表看起來(lái)就是一個(gè)普通的參數(shù)列表,除了它使用的是方括號(hào)而不是小括號(hào)。

先從浮點(diǎn)值的基本非泛型 Min 函數(shù)開(kāi)始:

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

通過(guò)添加類(lèi)型形參列表來(lái)使這個(gè)函數(shù)泛型化——使其適用于不同的類(lèi)型。在此示例中,添加了一個(gè)帶有單個(gè)類(lèi)型形參T的類(lèi)型參數(shù)列表,并替換了float64。

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

然后就可以使用類(lèi)型實(shí)參調(diào)用此函數(shù):

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

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

成功實(shí)例化后,即可產(chǎn)生非泛型函數(shù),它可以像任何其他函數(shù)一樣被調(diào)用。比如:

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

GMin[float64]的實(shí)例化產(chǎn)生了一個(gè)與Min函數(shù)等效的函數(shù),可以在函數(shù)調(diào)用中使用它。類(lèi)型形參也可以與類(lèi)型一起使用。

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

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

var stringTree Tree[string]

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

類(lèi)型推斷

此項(xiàng)功能是最復(fù)雜的變更,主要包括:

  • 函數(shù)參數(shù)類(lèi)型推斷 (Function argument type inference)
  • 約束類(lèi)型推斷 (Constraint type inference)

雖然類(lèi)型推斷的工作原理細(xì)節(jié)很復(fù)雜,但使用它并不復(fù)雜:類(lèi)型推斷要么成功,要么失敗。如果它成功,類(lèi)型實(shí)參可以被省略,調(diào)用泛型函數(shù)看起來(lái)與調(diào)用普通函數(shù)沒(méi)有什么不同。如果類(lèi)型推斷失敗,編譯器將給出錯(cuò)誤消息,在這種情況下,只需提供必要的類(lèi)型實(shí)參。

泛型是 Go 1.18 的重要新語(yǔ)言特性,Robert Griesemer 和 Ian Lance Taylor 表示,這個(gè)功能實(shí)現(xiàn)得很好并且質(zhì)量很高。雖然他們鼓勵(lì)在有必要的場(chǎng)景中使用泛型,但在生產(chǎn)環(huán)境中部署泛型代碼時(shí),請(qǐng)務(wù)必謹(jǐn)慎。

本文轉(zhuǎn)自O(shè)SCHINA

本文標(biāo)題:Go 語(yǔ)言之父介紹泛型

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

資訊來(lái)源:https://go.dev/blog/intro-generics

責(zé)任編輯:未麗燕 來(lái)源: 開(kāi)源中國(guó)
相關(guān)推薦

2021-10-18 10:53:26

Go 代碼技術(shù)

2024-10-28 00:40:49

Go語(yǔ)法版本

2024-01-05 20:46:14

2021-01-13 10:52:29

C語(yǔ)言Linux計(jì)算機(jī)領(lǐng)域

2021-09-29 18:17:30

Go泛型語(yǔ)言

2024-01-08 08:23:07

Go語(yǔ)言代碼

2022-04-15 09:55:59

Go 泛型Go 程序函數(shù)

2021-10-23 06:42:14

Go語(yǔ)言接口

2021-10-03 22:18:14

Go語(yǔ)言整數(shù)

2023-07-21 14:20:03

ChatGPT神經(jīng)網(wǎng)絡(luò)

2020-12-31 09:06:44

Go語(yǔ)言Reflect

2011-10-20 13:09:19

JavaC

2021-01-14 05:20:48

Go語(yǔ)言泛型

2017-11-27 11:08:33

編程C語(yǔ)言代碼

2022-05-06 09:22:25

Go泛型

2011-10-19 13:41:02

JavaC語(yǔ)言丹尼斯·里奇

2011-10-19 13:38:41

Java

2021-10-09 07:52:01

Go程序重命名

2022-03-18 18:00:00

編程語(yǔ)言泛型支持模糊測(cè)試

2021-10-16 17:53:35

Go函數(shù)編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)