目錄
問題內容
解決方法
首頁 後端開發 Golang Golang 中的通用結構/介面列表

Golang 中的通用結構/介面列表

Feb 13, 2024 pm 05:30 PM
網路程式設計

Golang 中的通用结构/接口列表

php小編百草在這篇文章中將為大家介紹Golang中的通用結構/介面清單。 Golang是一種開源的程式語言,具有簡單易學、高效可靠的特點,被廣泛應用於網路程式設計、雲端運算等領域。在Golang中,通用結構和介面是非常重要的概念,可以幫助我們實現程式碼的複用性和擴充性。透過本文的介紹,相信讀者們能夠更好地理解和應用Golang中的通用結構和接口,提升自己的程式設計技能。

問題內容

有沒有辦法在 go 中獲得通用結構/介面的清單?

這就是我想要實現的目標。

<code>package main

type List[T any] struct {
    Elements []T
}

func (f *List[T]) Add(el T) {
    f.Elements = append(f.Elements, el)
}

type ListInterface[T any] interface {
    Add(el T)
}

func main() {
    listOfLists := make([]ListInterface[any], 0)
    listOfLists = append(listOfLists, &List[int]{})
}
</code>
登入後複製

這是我得到的錯誤。

cannot use &List[int]{} (value of type *List[int]) as ListInterface[any] value in argument to append: *List[int] does not implement ListInterface[any] (wrong type for method Add)
    have Add(int)
    want Add(any)
登入後複製

所以,如果我理解正確的話,在 go 中 any# 是它自己的類型。它不是“運行時想要的任何類型”的同義詞。我的問題是,是否有可能做這樣的事情?

解決方法

您在這裡嘗試執行的操作表明您期望 go 的泛型能夠進行類型擦除(就像 Java 泛型一樣)。但事實並非如此。

你有一個 List[int],這表示它的 Add 方法如下所示:

func (l *List) Add(el int) {
    l.Elements = append(l.Elements, el)
}
登入後複製

然後嘗試將其新增至實作該介面的物件切片:

Add(v any)
登入後複製

現在,您可能認為 int 可以用作 any,您是對的,它可以,但是當您看到:

var s []ListInterface[any]
登入後複製

您是說,所述切片中的所有元素都將具有 Add 方法,該方法採用 any 類型的參數,因此這意味著:

s[0].Add("foo")
s[1].Add(123)
登入後複製

應該始終是有效的呼叫。如果 s[0] 的類型為 List[int] (如您的程式碼片段中的情況),則這不成立。您將嘗試將字串附加到 Elements ,其類型為 []int

有一種說法認為應該允許逆向:

s := []ListInterface[int]{}
s = append(s, &List[any]{})
登入後複製

看來 List[any] 將接受 int 參數,但這也是不允許的。在某些情況下這可能很有用,但在許多情況下這可能會出現問題。

本質上,Go 中的泛型是在編譯時處理的事情。當您建立List[int] 時,編譯器會建立一個類似List_int 的類型,並在該類型上實作Add(el int) 方法,與您最終使用的任何其他List 類型相同。這些類型都不會具有 Add(any) 方法,除非您建立 List[any]。將其視為編譯器輔助的樣板程式碼產生。不是運行時類型擦除。

結果: List[int]List[any] 是完全不同的型,因此不能並排坐在切片中,就好像它們是同一型別一樣。如果您希望能夠做您想做的事情,您可以這樣做:

func (l *List[T]) AddAny(v any) {
    tv, ok := v.(T)
    if !ok {
        return // or return an error
    }
    l.Add(tv)
}
登入後複製

採用 any 值的方法,使用類型斷言來查看給定值是否與清單的基礎類型相容,如果是這種情況則會新增它。然後您可以將它們添加到單個切片中,如下所示:

type Lists interface {
    AddAny(any)
}

s := []Lists{}
s = append(s, &List[int]{}, &List[string]{})
s[0].AddAny(123) // will work
s[0].AddAny("foo") // will not, with the current code this will silently fail
s[1].AddAny("foo") // works fine
s[1].AddAny(123) // silently fails
登入後複製

但實際上,當你做這樣的事情時,代碼只是尖叫X-Y 問題,你試圖使用Y(泛型)來解決你的問題,而真正的問題是X:什麼是最好的方法解決問題?

以上是Golang 中的通用結構/介面列表的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
c++開源函式庫有哪些 c++開源函式庫有哪些 Apr 22, 2024 pm 05:48 PM

C++ 提供豐富的開源函式庫,涵蓋以下功能:資料結構和演算法(標準範本庫)多執行緒、正規表示式(Boost)線性代數(Eigen)圖形使用者介面(Qt)電腦視覺(OpenCV)機器學習(TensorFlow)加密(OpenSSL)資料壓縮(zlib)網路程式設計(libcurl)資料庫管理(sqlite3)

C++ 函數在網路程式設計中如何處理 DNS 查詢? C++ 函數在網路程式設計中如何處理 DNS 查詢? Apr 27, 2024 pm 06:39 PM

C++標準函式庫提供了函式來處理網路程式設計中的DNS查詢:gethostbyname():根據主機名稱尋找主機資訊。 gethostbyaddr():根據IP位址尋找主機資訊。 dns_lookup():非同步解析DNS。

python考級有幾個等級 python考級有幾個等級 Apr 02, 2024 pm 06:00 PM

Python 考級共有 12 級,從初級到高級,依序掌握 Python 基礎語法、高級特性、高級概念和底層機制等,難度逐漸遞增。

Java網路程式設計有哪些常見的協定? Java網路程式設計有哪些常見的協定? Apr 15, 2024 am 11:33 AM

Java網路程式設計中常用的協定包括:TCP/IP:用於可靠資料傳輸和連線管理。 HTTP:用於Web資料傳輸。 HTTPS:HTTP的安全版本,使用加密傳輸資料。 UDP:用於快速但不穩定的資料傳輸。 JDBC:用於與關聯式資料庫互動。

Java網路程式設計如何使用UDP進行無連線通訊? Java網路程式設計如何使用UDP進行無連線通訊? Apr 15, 2024 pm 12:51 PM

UDP(用戶資料報協議)是一種輕量級的無連接網路協議,常用於時間敏感的應用程式。它允許應用程式在無需建立TCP連接的情況下發送和接收資料。範例Java程式碼可用於建立UDP伺服器和用戶端,伺服器監聽傳入資料封包並回應,客戶端傳送訊息並接收回應。此程式碼可用於建立聊天應用程式或資料收集系統等實戰案例。

Golang 常用函數位址解析指南 Golang 常用函數位址解析指南 Apr 08, 2024 pm 02:18 PM

Go語言中解析位址的關鍵函數包括:net.ParseIP():解析IPv4或IPv6位址。 net.ParseCIDR():解析CIDR標記。 net.ResolveIPAddr():解析主機名稱或IP位址為IP位址。 net.ResolveTCPAddr():解析主機名稱和連接埠為TCP位址。 net.ResolveUDPAddr():解析主機名稱和連接埠為UDP位址。

python可以做哪些項目 python可以做哪些項目 Apr 11, 2024 am 03:43 AM

Python 可用於以下應用:網站開發(Django、Flask)資料科學(NumPy、Pandas)人工智慧和機器學習(TensorFlow、Keras)腳本自動化桌面應用程式(PyQt、tkinter)遊戲開發網頁程式設計(asyncio、Tornado)資料視覺化(Matplotlib、Seaborn)

C++ 函式在網路程式設計中如何實現網路安全? C++ 函式在網路程式設計中如何實現網路安全? Apr 28, 2024 am 09:06 AM

C++函數在網路程式設計中可實現網路安全,方法包括:1.使用加密演算法(openssl)加密通訊;2.使用數位簽章(cryptopp)驗證資料完整性與傳送者身分;3.防禦跨站腳本攻擊( htmlcxx)過濾和消毒使用者輸入。

See all articles