在本節(jié)中,您將添加通用函數(shù)調用的修改版本,進行小的更改以簡化調用代碼。您將刪除在這種情況下不需要的類型參數(shù)。

站在用戶的角度思考問題,與客戶深入溝通,找到錦屏網站設計與錦屏網站推廣的解決方案,憑借多年的經驗,讓設計與互聯(lián)網技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網站設計、網站制作、企業(yè)官網、英文網站、手機端網站、網站推廣、空間域名、網頁空間、企業(yè)郵箱。業(yè)務覆蓋錦屏地區(qū)。
當 Go 編譯器可以推斷您要使用的類型時,您可以在調用代碼中省略類型參數(shù)。編譯器從函數(shù)參數(shù)的類型推斷類型參數(shù)。
請注意,這并不總是可能的。例如,如果您需要調用沒有參數(shù)的泛型函數(shù),則需要在函數(shù)調用中包含類型參數(shù)。
在 main.go 中,在您已有的代碼下方,粘貼以下代碼。
在此代碼中:
(1)調用泛型函數(shù),省略類型參數(shù)。
從包含 main.go 的目錄中的命令行,運行代碼。
接下來,您將通過將整數(shù)和浮點數(shù)的并集捕獲到您可以重用的類型約束(例如從其他代碼中)來進一步簡化函數(shù)。
正如您將在本節(jié)中看到的,約束接口也可以引用特定類型。
1、編寫代碼
在此代碼中:
b.在您已有的函數(shù)下方,粘貼以下通用 SumNumbers函數(shù)。
在此代碼中:
c.在 main.go 中,在您已有的代碼下方,粘貼以下代碼。
在此代碼中:
(1)調用SumNumbers打印每個map的總和。
與上一節(jié)一樣,在調用泛型函數(shù)時省略了類型參數(shù)(方括號中的類型名稱)。Go 編譯器可以從其他參數(shù)推斷類型參數(shù)。
從包含 main.go 的目錄中的命令行,運行代碼。
做得很好!您剛剛學習了 Go 中的泛型。
Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成為現(xiàn)實。Go 團隊實施了一個看起來比較穩(wěn)定的設計草案,并且正以源到源翻譯器原型的形式獲得關注。本文講述的是泛型的最新設計,以及如何自己嘗試泛型。
例子
FIFO Stack
假設你要創(chuàng)建一個先進先出堆棧。沒有泛型,你可能會這樣實現(xiàn):
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)這樣的代碼。這不僅讓人眼花繚亂,而且還可能引發(fā)錯誤。比如忘記 * 怎么辦?或者如果您輸入錯誤的類型怎么辦?s.Push(MyObject{})` 可以順利編譯,而且你可能不會發(fā)現(xiàn)到自己的錯誤,直到它影響到你的整個服務為止。
通常,使用 interface{} 是相對危險的。使用更多受限制的類型總是更安全,因為可以在編譯時而不是運行時發(fā)現(xiàn)問題。
泛型通過允許類型具有類型參數(shù)來解決此問題:
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 添加一個類型參數(shù),從而完全不需要 interface{}。現(xiàn)在,當你使用 Peek() 時,返回的值已經是原始類型,并且沒有機會返回錯誤的值類型。這種方式更安全,更容易使用。(譯注:就是看起來更丑陋,^-^)
此外,泛型代碼通常更易于編譯器優(yōu)化,從而獲得更好的性能(以二進制大小為代價)。如果我們對上面的非泛型代碼和泛型代碼進行基準測試,我們可以看到區(qū)別:
type?MyObject?struct?{
X?
int
}
var?sink?MyObjectfunc?BenchmarkGo1(b?*testing.B)?{
for?i?:=?0;?i??b.N;?i++?{
var?s?Stack
s.Push(MyObject{})
s.Push(MyObject{})
s.Pop()
sink?=?s.Peek().(MyObject)
}
}
func?BenchmarkGo2(b?*testing.B)?{
for?i?:=?0;?i??b.N;?i++?{
var?s?Stack(MyObject)
s.Push(MyObject{})
s.Push(MyObject{})
s.Pop()
sink?=?s.Peek()
}
}
結果:
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)
上面的堆棧示例適用于任何類型。但是,在許多情況下,你需要編寫僅適用于具有某些特征的類型的代碼。例如,你可能希望堆棧要求類型實現(xiàn) String() 函數(shù)
1、簡單易學。
Go語言的作者本身就很懂C語言,所以同樣Go語言也會有C語言的基因,所以對于程序員來說,Go語言天生就會讓人很熟悉,容易上手。
2、并發(fā)性好。
Go語言天生支持并發(fā),可以充分利用多核,輕松地使用并發(fā)。 這是Go語言最大的特點。
描述
Go的語法接近C語言,但對于變量的聲明有所不同。Go支持垃圾回收功能。Go的并行模型是以東尼·霍爾的通信順序進程(CSP)為基礎,采取類似模型的其他語言包括Occam和Limbo,但它也具有Pi運算的特征,比如通道傳輸。
在1.8版本中開放插件(Plugin)的支持,這意味著現(xiàn)在能從Go中動態(tài)加載部分函數(shù)。
與C++相比,Go并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數(shù)等功能,但增加了 切片(Slice) 型、并發(fā)、管道、垃圾回收、接口(Interface)等特性的語言級支持。
go泛型2022年出。
Golang團隊認為在類型系統(tǒng)和運行時的復雜性花費太大,還沒找到可以和這個復雜性相抵的良好設計。內置的map和slice其實都有泛型的味道,加上可以用interface{}來構造容器,可以達到泛型的效果。所以目前為止還沒有直接的支持泛型。
Java語言泛型:
在Java SE 1.5之前,沒有泛型的情況的下,通過對類型Object的引用來實現(xiàn)參數(shù)的“任意化”,“任意化”帶來的缺點是要做顯式的強制類型轉換。
而這種轉換是要求開發(fā)者對實際參數(shù)類型可以預知的情況下進行的。對于強制類型轉換錯誤的情況,編譯器可能不提示錯誤,在運行的時候才出現(xiàn)異常,這是一個安全隱患。
函數(shù)式語言
Elixir
Elixir 比 Erlang 更容易編寫,具有 Haskell 等語言的函數(shù)式編程概念。Elixir是基于Erlang 虛擬機的,其廣為人知的特點是運行低延時、分布式、可容錯的系統(tǒng),并成功用于Web開發(fā)與嵌入式軟件領域。
Elm
Elm是一種用于構建 Web 應用程序的函數(shù)式語言。業(yè)內一般認為,它適用于創(chuàng)建高可交互應用,例如復雜的用戶界面,開發(fā)人員可以通過 Elm 快速編寫富有表現(xiàn)力的系統(tǒng)。Elm 也以沒有運行時異常而聞名。
PureScript
PureScript是一種可編譯為 JavaScript 的純函數(shù)式編程語言。與 Haskell 最相似的是,PureScript 最適合用于開發(fā) Web 應用程序和服務器端應用程序。
PureScript 支持類型推斷,與其他語言相比,需要明顯類型注釋要少得多。
Swift
Swift是一種由蘋果公司開發(fā)的通用編譯編程語言,最早的設想是替代上一代編程語言Objective-C ,過程中結合了Objective-C、Rust、Ruby 和 Python等語言的編程思想。目前Swift用于開發(fā)蘋果自己的手機、服務器、臺式機上的應用軟件。
程序語言
Go
Go語言是由谷歌公司創(chuàng)造的類似C風格的語言。Go 比 C++ 或 Java 更簡潔,比 Ruby 或 Python 更安全。
一些缺點: 編碼要求嚴格。比如,不能混用符號和無符號整數(shù)。還有一個明顯的遺漏,Go語言沒有泛型和繼承。
但Go語言的優(yōu)勢同樣明顯,簡單且易于使用。Go語言擅長于網絡和多線程方面的編程。
面向對象語言
DART
Dart同樣來自谷歌公司具有C語言風格。Dart可以輕松編寫JavaScript、Java for Android、本地機器代碼或獨立的 Dart 虛擬機。它還可以運行后端代碼。
Dart 非常適合使用事件驅動代碼構建用戶界面。根據Dart 團隊成員的說法,Dart的優(yōu)勢:可選的靜態(tài)類型、最小的編譯時錯誤和強大的內置編輯器。
Pony
Pony是一種基于無數(shù)據競爭類型和垃圾收集的語言,并使用 actor 模型以及稱為引用功能的東西。
你可以把 Pony 想象成某種“Rust 遇上 Erlang”的復合體,沒有鎖,高并發(fā)是其主要優(yōu)點。
Pony 的缺點是 API 穩(wěn)定性低、很少有高質量的第三方庫和有限的本地工具。
TypeScript
TypeScript是一個基于 JavaScript 靜態(tài)類型定義構建,并由微軟維護且開源編程語言。Visual Studio Code 或Visual Studio 是推薦的IDE編輯器,微軟大廠的用戶體驗和錯誤檢查也不用懷疑。
復合編程語言
Hack
Hack是一種作為 PHP 方言的 HipHop 虛擬機的編程語言。于 2014 年由Facebook創(chuàng)建,允許程序員同時使用靜態(tài)和動態(tài)類型(也稱為漸進類型),這為編碼提供了靈活性。
Julia
Julia是一種高級通用編程語言,用于計算科學和數(shù)值分析。Julia 以動態(tài)類型和可重現(xiàn)的高性能特性而聞名。
Julia 在數(shù)據可視化和機器學習等方面都有大量用途。事實上,它被英國保險公司 Aviva 用于風險計算,紐約聯(lián)邦儲備銀行用于金融建模,甚至氣候建模聯(lián)盟用于氣候變化建模。它擁有Fortran、C++、R、Java、C 、Python等的接口,這使其成為最受追捧的新語言之一。
Kotlin
Kotlin是運行在 Java 虛擬機中的更快、更流暢的 Java 版本。它現(xiàn)在是Android 開發(fā)的首選語言。根據 Android 開發(fā)者網站顯示,程序員正轉而采用 Kotlin,因為該語言的樣板代碼更少,空指針異常更少,并且與 Java 有互操作性。
Kotlin 可用于在 iOS 和 Android 上運行的應用程序、不使用額外運行時或虛擬機。
Nim
Nim是一種優(yōu)先考慮可讀性的靜態(tài)類型語言。通過結合多種語言的特性,Nim 為程序員提供了速度和易用性。
它帶有 JavaScript 后端、分散的包管理、自動內存管理、C 和 C++ 庫的綁定以及用于調試的回溯。作為一種語言,Nim 是有限的,但它包含一組元編程功能,如泛型、模板和宏,因此開發(fā)人員可以在避免冗長代碼的同時以不同的風格工作。
OCaml作為此列表中較舊的語言,OCaml是一種多范式語言——既有函數(shù)式、命令式和類型安全,也具有面向對象功能。
OCaml 的一些優(yōu)勢:定義數(shù)據類型很容易。默認情況下,所有變量都是不可變的。API 穩(wěn)定,具有良好的庫向后兼容性。該語言還為獨立應用程序提供自動內存管理和單獨編譯。
Reason
如果比JavaScript 更快、更簡單且類型安全會怎樣?
這就是創(chuàng)建Reason的 Facebook 開發(fā)者想要回答的問題。不過,他并沒有從頭開始構建一種新語言,而是采用了 OCaml,并將其調整為類似于 JavaScript。
Reason使用項目 BucketScript編譯為 JavaScript,并且可以訪問 80% 的 JavaScript 工具和生態(tài)系統(tǒng)。它還可以編譯為準系統(tǒng)、iOS、Android 和微控制器。
Red
Red是一種最初旨在克服 Rebol 語言限制的編程語言。Red 于 2011 年推出,受 Rebol、Lua 和 Scala 等語言的影響,對高級和低級編程都很有用。
該語言可用于開發(fā)從高級 GUI 到低級操作系統(tǒng)的所有方面。Red 擁有人性化的語法、低內存占用和垃圾收集等優(yōu)點。
Rust
Rust解決了一些與 Go 相同的問題,如系統(tǒng)級別的線程和進程安全,,但Rust 更像 C 風格的語法
但Rust語言的缺點:靜態(tài)類型和缺乏垃圾收集
Rust可直接訪問內存意味著程序員可以編寫低級代碼,如操作系統(tǒng)內核。Rust 也非常適合嵌入式設備、網絡服務和命令行編寫。
網站欄目:go語言泛型,go語言泛型的性能
文章路徑:http://chinadenli.net/article26/dsgscjg.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供服務器托管、Google、響應式網站、手機網站建設、定制網站、微信小程序
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)