目錄
問題內容
解決方法
首頁 後端開發 Golang Go:如何指定型別約束,其中方法的參數類型與接收者的型別相同

Go:如何指定型別約束,其中方法的參數類型與接收者的型別相同

Feb 09, 2024 pm 04:33 PM
go語言

Go:如何指定型別約束,其中方法的參數類型與接收者的型別相同

在Go語言中,我們可以使用型別約束來指定函數或方法的參數型別。當我們希望方法的參數類型與接收者的類型相同時,該如何指定呢?首先,要先明確的是,Go語言中並沒有直接支援參數類型與接收者類型相同的特性。然而,我們可以透過在方法定義中使用指標類型來實現類似的效果。接下來,我們將詳細介紹如何在Go語言中指定參數類型與接收者類型相同的方法。

問題內容

我想指定如下所示的類型約束:

type Comparer interface {
    Compare(another Comparer) int
}
登入後複製

但我希望實作類型將其自身的具體類型傳遞到方法Compare 而不是介面Comparer 中,如下所示(我知道以下沒有實作Comparer):

func (a MyInt) Compare(b MyInt) int {
    xxxx
    return xxxx
}
登入後複製

我嘗試使用這樣的通用介面:

type Comparer[T any] interface {
    Compare(T) int
}
登入後複製
登入後複製

但這並不強制方法 Compare 的接收者也是型別 T。

有沒有辦法強制方法 Compare 的接收者類型和參數類型相同?

解決方法

當您談論約束時,您本質上是指介面類型的特定用法作為對類型參數集的限制。

因此,當您(正確)將介面定義為:

type Comparer[T any] interface {
    Compare(T) int
}
登入後複製
登入後複製

你只講了故事的一半。事實上,上述並不是一個限制。它只是一個介面。

為了真正成為一種類型約束,該介面必須被用作一個。

func Foo[T Comparer[T]](t1, t2 T) int {
    return t1.Compare(t2)
}

type Thing[T Comparer[T]] struct {
    Value T
}
登入後複製

只有在類型參數清單中,您可以透過使用其類型參數實例化約束來強制 Compare(T) 的接收者為 T 本身。

當不用作約束時,介面只是方法集的定義,根據設計對可以實現它的類型沒有任何限制。

<小时>

現在,可以使用類型術語來指定哪些類型必須實作某個介面。但是類型參數不能直接用作型別術語。您必須使用未命名類型,例如指向 T 的指標:

type Comparer[T any] interface {
    *T
    Compare(T) int
}
登入後複製

請注意,這會強迫您在指標接收器上宣告方法,例如 *MyInt,這可能是理想的,也可能不是理想的。

無論如何,這不能用它自己的類型參數實例化為 T Comparer[T] 因為無論 T 是什麼,約束都會施加額外的指標間接層級。函數參數永遠不會滿足它。

實現此功能的技巧是使用不同的類型參數實例化 Comparer

func test[T any, V Comparer[T]](a, b T) int {
    return V(&a).Compare(b)
}
登入後複製

並將方法宣告為:

type MyInt int

func (t *MyInt) Compare(other MyInt) int {
    // implementation
}
登入後複製

儘管如果您按預期使用介面約束,則這種複雜的解決方法就變得完全沒有必要。

遊樂場https://www.php.cn/link/3ea816621e0d8ecd5e534ec28051d4d5

以上是Go:如何指定型別約束,其中方法的參數類型與接收者的型別相同的詳細內容。更多資訊請關注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

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

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

Go的爬蟲Colly中Queue線程的問題是什麼? Go的爬蟲Colly中Queue線程的問題是什麼? Apr 02, 2025 pm 02:09 PM

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

Go語言中用於浮點數運算的庫有哪些? Go語言中用於浮點數運算的庫有哪些? Apr 02, 2025 pm 02:06 PM

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

在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? 在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? Apr 02, 2025 pm 04:54 PM

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

在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? 在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? Apr 02, 2025 pm 02:03 PM

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

GoLand中自定義結構體標籤不顯示怎麼辦? GoLand中自定義結構體標籤不顯示怎麼辦? Apr 02, 2025 pm 05:09 PM

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

Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Apr 02, 2025 pm 12:57 PM

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

Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Apr 02, 2025 pm 04:12 PM

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...

在Go編程中,如何正確管理Mysql和Redis的連接與釋放資源? 在Go編程中,如何正確管理Mysql和Redis的連接與釋放資源? Apr 02, 2025 pm 05:03 PM

Go編程中的資源管理:Mysql和Redis的連接與釋放在學習Go編程過程中,如何正確管理資源,特別是與數據庫和緩存�...

See all articles