Go 泛型:無效的複合文字
php小編西瓜為您帶來了最新的資訊-「Go 泛型:無效的複合文字」。在Go語言社群中,泛型一直是備受關注的議題。隨著Go 1.18版本的發布,泛型將正式納入Go語言的標準函式庫。然而,這項決定並不是所有人都能接受的。本文將探討泛型在Go語言中的實現方式以及相關的爭議和討論,幫助讀者更好地理解這項技術,並為其在實際開發中的應用提供參考。
問題內容
以下程式碼會導致錯誤「無效的複合文字類型 t」。
package main import "fmt" func main() { fmt.Println(createThing[foo]()) } type thing interface { foo | bar } type foo struct { id int a string } type bar struct { id int b int } func createThing[T thing, P *T]() P { return &T{} }
如果我只在介面thing
中包含thing
#,或刪除a string
和b int
,那麼foo
和bar
完全相同,程式碼將運行沒有錯誤。然而,這是否違背了泛型的目的?為什麼我不能實例化這樣的泛型類型,尤其是當我什至沒有訪問任何字段時?
可能與 https://github.com/golang/go/issues/48522 相關
解決方法
大多數泛型類型對於複合文字來說不是有效類型。但這不是問題,因為還有其他方法可以建立泛型類型的值。
建立指向新零值的指標:
func creatething[t thing]() *t { return new(t) }
或建立一個非指標零值:
func createThing[T thing]() T { var value T return value }
至於為什麼以這種方式發生錯誤,這裡是規範中的解釋,經過修改以解決您的特定問題。
對於複合文字:
literaltype 的核心類型 t 必須是結構體、陣列、切片或映射類型
核心類型是什麼?
介面 t 具有核心類型,如果 [...] 存在單一類型 u,它是 t 類型集中所有類型的基礎類型
沒有其他介面具有核心類型。
底層型別是什麼?
每個類型 t 都有一個基礎類型:如果 t 是預先宣告的布林、數字或字串類型之一,或類型文字,則對應的基礎類型是 t 本身。否則,t 的基礎類型是 t 在其聲明中引用的類型的基礎類型。
「類型文字」可以指文字結構類型,例如 struct{int id}
。因此,當foo
和bar
都具有struct{int id}
的底層類型時,則thing
具有struct{int id}
的核心型別,因此複合文字是可能的。當 foo
和 bar
沒有相同的底層類型時,則 thing
沒有核心類型,並且複合文字是不可能的,因此您的錯誤。
正式的定義可能看起來很複雜,但結果和實際要點很簡單:泛型程式碼只能表達可能類型的常見行為。除了在所有基礎類型都相同的特殊情況下,文字值並不是常見的行為。
以上是Go 泛型:無效的複合文字的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

語言多線程可以大大提升程序效率,C 語言中多線程的實現方式主要有四種:創建獨立進程:創建多個獨立運行的進程,每個進程擁有自己的內存空間。偽多線程:在一個進程中創建多個執行流,這些執行流共享同一內存空間,並交替執行。多線程庫:使用pthreads等多線程庫創建和管理線程,提供了豐富的線程操作函數。協程:一種輕量級的多線程實現,將任務劃分成小的子任務,輪流執行。

C語言標準庫中沒有名為“sum”的函數。 “sum”通常由程序員定義或在特定庫中提供,其功能取決於具體實現。常見的場景是針對數組求和,還可用於其他數據結構,如鍊表。此外,“sum”在圖像處理和統計分析等領域也有應用。一個優秀的“sum”函數應具有良好的可讀性、健壯性和效率。

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

Go語言中結構體定義的兩種方式:var與type關鍵字的差異Go語言在定義結構體時,經常會看到兩種不同的寫法:一�...
