首頁 > 後端開發 > Golang > 主體

存取傳遞給可變參數函數的通用結構的特定字段

WBOY
發布: 2024-02-15 15:42:23
轉載
1077 人瀏覽過

存取傳遞給可變參數函數的通用結構的特定字段

php小編草莓為您介紹特定欄位的通用結構,用於將存取傳遞給可變參數函數。可變參數函數是一種接受不定數量參數的函數,但在實際應用中,我們常常需要將特定欄位的值傳遞給這些函數。透過這種通用結構,我們可以輕鬆地將存取傳遞給可變參數函數,並指定特定欄位的值,從而實現更靈活和精確的參數傳遞。這種通用結構可以大大簡化我們的程式碼,並提高程式碼的可讀性和可維護性。

問題內容

假設我有一個名為 foo 的通用 struct

type foo[t any] struct {
    data t
}
登入後複製

我有一個可變參數函數,我想將一些 foos 傳遞給它。它們可以是任何類型的 foo。我的理解是,因為foo[int]foo[string] 不同,所以我需要將省略號定義為any 類型,如下所示:

func bar(things ...any) {
    for _, v := range things {
        fmt.println(v)
    }
}
登入後複製

這確實有效。

func main() {
    a := foo[string]{"cheese"}
    b := foo[int]{42}

    bar(a, b)
}
登入後複製

我的問題是我想專門存取每個 foo 中的 data 欄位。但是如果我像這樣定義 bar

func bar(things ...any) {
    for _, v := range things {
        fmt.println(v.data)
    }
}
登入後複製

編譯器會感到不安,這是可以理解的,因為 things 可能是任何東西,因此不能保證它們具有 data 欄位。

知道會有一個名為data 的字段,因為我總是傳遞foos,但我不能指定我只傳遞 foos,就像這樣,

func bar(things ...foo) {
    for _, v := range things {
        fmt.Println(v.data)
    }
}
登入後複製

因為沒有指定foo的型別。

如何將未指定數量的 foo 傳遞給 bar,然後存取 data 欄位?

解決方法

一種解決方案似乎是使用反射並使用 fieldbyname 存取該欄位:

func bar(things ...any) {
    for _, v := range things {
        x := reflect.ValueOf(v)
        fmt.Println(x.FieldByName("data"))
    }
}
登入後複製

我不清楚這是否會因為某種原因被認為是一種障礙和/或危險。據推測,我需要在那裡進行一些檢查,以確保 things 中的所有內容實際上都是某種 foo ,否則我可能會嘗試訪問不存在的字段。

以上是存取傳遞給可變參數函數的通用結構的特定字段的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板