在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中文網其他相關文章!