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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

go func()和 go_Go的泛型真的要来了—如何使用以及它们是怎么工作的

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go func()和 go_Go的泛型真的要来了—如何使用以及它们是怎么工作的 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


點擊上方藍色“Go語言中文網”關注我們,領全套Go資料,每天學習 Go 語言

你沒看錯,這里講的就是 Go 中的泛型。只不過還沒有正式發布,是基于草案設計的,已經是實現了可運行的版本。所以,泛型到來真的不遠了!

Go 中的泛型已經接近成為現實。本文講述的是泛型的最新設計,以及如何自己嘗試泛型。

Generics in Go —— How They Work and How to Play With Them

Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成為現實。Go 團隊實施了一個看起來比較穩定的設計草案,并且正以源到源翻譯器原型的形式獲得關注。本文講述的是泛型的最新設計,以及如何自己嘗試泛型。

例子

FIFO Stack

假設你要創建一個先進先出堆棧。沒有泛型,你可能會這樣實現:

type?Stack?[]interface{}func?(s?Stack)?Peek()?interface{}?{?return?s[len(s)-1]}func?(s?*Stack)?Pop()?{?*s?=?(*s)[:len(*s)-1]}func?(s?*Stack)?Push(value?interface{})?{?*s?=?append(*s,?value)}

但是,這里存在一個問題:每當你 Peek 項時,都必須使用類型斷言將其從 interface{} 轉換為你需要的類型。如果你的堆棧是 *MyObject 的堆棧,則意味著很多 s.Peek().(*MyObject)這樣的代碼。這不僅讓人眼花繚亂,而且還可能引發錯誤。比如忘記 * 怎么辦?或者如果您輸入錯誤的類型怎么辦?s.Push(MyObject{})` 可以順利編譯,而且你可能不會發現到自己的錯誤,直到它影響到你的整個服務為止。

通常,使用 interface{} 是相對危險的。使用更多受限制的類型總是更安全,因為可以在編譯時而不是運行時發現問題。

泛型通過允許類型具有類型參數來解決此問題:

type?Stack(type?T)?[]Tfunc?(s?Stack(T))?Peek()?T?{?return?s[len(s)-1]}func?(s?*Stack(T))?Pop()?{?*s?=?(*s)[:len(*s)-1]}func?(s?*Stack(T))?Push(value?T)?{?*s?=?append(*s,?value)}

這會向 Stack 添加一個類型參數,從而完全不需要 interface{}。現在,當你使用 Peek() 時,返回的值已經是原始類型,并且沒有機會返回錯誤的值類型。這種方式更安全,更容易使用。(譯注:就是看起來更丑陋,^-^)

此外,泛型代碼通常更易于編譯器優化,從而獲得更好的性能(以二進制大小為代價)。如果我們對上面的非泛型代碼和泛型代碼進行基準測試,我們可以看到區別:

type?MyObject?struct?{????X?int}var?sink?MyObjectfunc?BenchmarkGo1(b?*testing.B)?{?for?i?:=?0;?i?

結果:

BenchmarkGo1BenchmarkGo1-16?????12837528?????????87.0?ns/op???????48?B/op????????2?allocs/opBenchmarkGo2BenchmarkGo2-16?????28406479?????????41.9?ns/op???????24?B/op????????2?allocs/op

在這種情況下,我們分配更少的內存,同時泛型的速度是非泛型的兩倍。

合約(Contracts)

上面的堆棧示例適用于任何類型。但是,在許多情況下,你需要編寫僅適用于具有某些特征的類型的代碼。例如,你可能希望堆棧要求類型實現 String() 函數。這就是 Contracts :

contract?stringer(T)?{?T?String()?string}type?Stack(type?T?stringer)?[]T//?Now?we?can?use?the?String?method?of?T:func?(s?Stack(T))?String()?string?{?ret?:=?""?for?_,?v?:=?range?s?{??if?ret?!=?""?{???ret?+=?",?"??}??ret?+=?v.String()?}?return?ret}

更多示例

以上示例僅涵蓋了泛型的基礎知識。你還可以在函數中添加類型參數,并在合約(Contracts)中添加特定類型。

有關更多示例,你可以從兩個地方獲得:

設計草案

設計草案包含更詳細的描述以及更多示例:

https://go.googlesource.com/proposal/+/4a54a00950b56dd0096482d0edae46969d7432a6/design/go2draft-contracts.md,如果訪問不了,可以看我備份的:https://github.com/polaris1119/go_dynamic_docs/blob/master/go2draft-contracts.md。

實現原型的 CL

原型 CL 也有幾個示例。查找以“ .go2”結尾的文件:

https://go-review.googlesource.com/c/go/+/187317

如何嘗試泛型?

使用 WebAssembly Playground

到目前為止,嘗試泛型的最快,最簡單的方法是通過 WebAssembly Playground[1]。它使用 WASM 構建的源代碼到源代碼翻譯器原型在你的瀏覽器中直接運行 Go 代碼。但這存在一些限制(請參見 https://github.com/ccbrown/wasm-go-playground)。

編譯 CL

上面引用的 CL[2] 包含一個源到源轉換器的實現,該轉換器可用于將泛型代碼編譯為可以由 Go 的當前版本編譯的代碼。它將泛型代碼(“多態”代碼)稱為Go 2代碼,將非多態代碼稱為 Go 1 代碼,但是根據實現的細節,泛型可能會成為 Go 1 版本而不是 Go 2 版本的一部分。

它還添加了一個 “go2go” 命令,可用于從 CLI 轉換代碼。

你可以按照 Go 的從源代碼安裝 Go 指令來編譯 CL。當你到達可選的 “Switch to the master branch” 步驟時,請 用 checkout CL 代替:

git?fetch?"https://go.googlesource.com/go"?refs/changes/17/187317/14?&&?git?checkout?FETCH_HEAD

請注意,這將檢出補丁集 14,這是撰寫本文時的最新補丁集。轉到 CL[3] 并找到“下載”按鈕以獲取最新補丁集的簽出命令。

編譯 CL 之后,可以使用 go/* 包編寫用于使用泛型的自定義工具,或者可以僅使用 go2go 命令行工具:

go?tool?go2go?translate?mygenericcode.go2

原文鏈接:https://blog.tempus-ex.com/generics-in-go-how-they-work-and-how-to-play-with-them/

作者:Chris Brown[4]

日期:2020-04-08

翻譯:polaris

參考資料

[1]WebAssembly Playground: https://ccbrown.github.io/wasm-go-playground/experimental/generics/

[2]CL: https://go-review.googlesource.com/c/go/+/187317

[3]CL: https://go-review.googlesource.com/c/go/+/187317

[4]Chris Brown: https://blog.tempus-ex.com/author/chris/

推薦閱讀

  • 你期待泛型嗎?為什么Go語言沒有泛型?何時會有?
  • Go和Rust的優缺點;預測Go1.16-1.19會支持泛型

總結

以上是生活随笔為你收集整理的go func()和 go_Go的泛型真的要来了—如何使用以及它们是怎么工作的的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 动漫美女舌吻 | 国产无套内射普通话对白 | 日本系列第一页 | 无码 制服 丝袜 国产 另类 | 97人妻人人揉人人躁人人 | 97伦伦午夜电影理伦片 | 国产精品性色 | www.呦呦 | xxx久久 | 91福利视频在线 | 涩涩涩在线观看 | av导航在线观看 | 按摩害羞主妇中文字幕 | 成人啪啪18免费游戏链接 | 欧美爱爱爱 | 91天堂网| 日韩免费 | 欧美一二三视频 | 色哟哟精品观看 | 欧美日本中文字幕 | 永久免费在线 | 国产精品亚洲五月天丁香 | 亚洲国产一二 | 三上悠亚痴汉电车 | 天天想你免费观看完整版高清电影 | 欧美aaaaa| 人妻少妇精品中文字幕av蜜桃 | 最近中文字幕在线免费观看 | 4虎最新网址 | 亚洲视频图片 | 一级免费看| 日韩精品电影一区 | 少妇 av| 日韩久久一区二区三区 | 国产日韩精品电影 | 91成人破解版 | 久久久久久久久久久久久国产 | 黄色香港三级三级三级 | 九色在线观看 | 久久99精品国产91久久来源 | 美女三级网站 | 亚洲综合日韩精品欧美综合区 | 人妻一区二区三区视频 | 在哪里可以看黄色片 | 成年人免费在线观看 | 99精品国自产在线 | 国产福利三区 | 久久激情综合网 | 色撸撸av | 久久在线视频精品 | 欧美小视频在线观看 | 三级黄色短视频 | 亚洲精品乱码久久久久99 | 成年人视频网 | 少妇被黑人到高潮喷出白浆 | www.桃色 | 伊人激情综合网 | 久久久久久久久久久99 | 俺去日 | 一级伦理农村妇女愉情 | 操操综合 | 日韩av二区| 色噜噜在线播放 | 亚洲欧美国产精品久久久久久久 | 日韩中文字幕一区二区 | 青青草亚洲 | 五月综合色婷婷 | 在线观看亚洲一区二区 | 国产成人精品视频在线 | 情涩快播 | 亚洲一区二区三区在线视频观看 | 欧美bbbbbbbbbbbb1| 狼人综合视频 | 爱射综合 | 99国产在线观看 | 精品无码av一区二区三区 | 欧美在线v| 精品无码人妻少妇久久久久久 | 久久精品人人爽 | 深夜福利一区 | 免费三级黄 | 天天操天天插天天射 | 亚洲爱爱av | 国产美女一区二区三区 | 日韩免费视频一区二区 | 黄色国产视频网站 | 激情噜噜 | 高清精品xnxxcom | 女生隐私免费看 | 一级片视频免费看 | 少妇系列av | 亚洲熟女一区二区 | 欧洲成人一区二区三区 | 嫩草影院在线视频 | 欧美韩日国产 | 性一交一乱一乱一视频 | 国产做爰高潮呻吟视频 | 国产chinasex麻豆videos | 黑人性高潮 |