首頁  >  文章  >  後端開發  >  如何存取 Golang 中作為「interface{}」傳遞的匿名結構的欄位?

如何存取 Golang 中作為「interface{}」傳遞的匿名結構的欄位?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-03 22:05:30816瀏覽

How to Access Fields of an Anonymous Struct Passed as `interface{}` in Golang?

在Golang 中存取作為Interface{} 傳遞的匿名結構

在Go 中,可以使用以下語法定義沒有方法的介面介面{}。但是,使用實作此類介面的類型可能會帶來挑戰,特別是在嘗試存取匿名結構體的欄位時。

請考慮以下範例,您希望將匿名結構體作為參數傳遞給函數:

<code class="go">package main

import (
    "fmt"
    "log"
    "time"
)

type job struct {
    name    string
    action  func()
    custom  interface{}
}

func NewJob(t string, name string, c func(), v interface{}) {
    job := process(t)
    job.name = name
    job.action = c
    job.custom = v

    go func() {
        for {
            job.action()
            time.Sleep(2 * time.Second)
        }
    }()
}

func Custom(name string) interface{} {
    for _, j := range jobs {
        if j.name != name {
            continue
        }
        return j.custom
    }
    return nil
}

func main() {
    NewJob("every 2 second", "pene", func() {
        t := Custom("pene")
        log.Println(t)
    }, struct {
        ID int
    }{
        1,
    })
}</code>

在此範例中,NewJob 函數會採用名為 v 的 interface{} 類型參數。在函數內部,您將作業結構體的自訂欄位設為 v。然後使用 goroutine 啟動作業每兩秒執行一次提供的函數。在 goroutine 中,您使用 Custom 函數檢索自訂字段,並嘗試存取匿名結構的 ID 欄位。但是,您會遇到錯誤:

t.ID undefined (type interface {} is interface with no methods)

這是因為interface{}類型沒有任何方法,因此您無法直接存取底層類型的欄位。要解決此問題,您必須先將介面「鍵入斷言」為適當的類型,然後才能存取其欄位。在這種情況下,您知道基礎類型是匿名結構體{ID int},因此您可以按如下所示鍵入斷言它:

<code class="go">id := v.(struct{ID int}).ID</code>

透過將v 類型斷言為正確的結構類型,您現在可以存取ID 欄位符合預期。

以上是如何存取 Golang 中作為「interface{}」傳遞的匿名結構的欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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