1. 程式人生 > 程式設計 >go巢狀匿名結構體的初始化詳解

go巢狀匿名結構體的初始化詳解

go匿名結構體

巢狀匿名結構體的 示例程式碼片.

type debugConfig struct {
 MaxQueueDepth int      `json:"maxQueueDepth"`
 ListenerEntries string `json:"listenerEntries"`
 Listeners  string
 Logging   struct {
 Info  string `json:"info"`
 Protocol string `json:"protocol"`
 Errlog string `json:"error"`
 Debug string `json:"debug"`
 }
}

初始化方式一

上述巢狀匿名結構體初始化賦值的示例程式碼片

 user1 := &debugConfig {
 MaxQueueDepth: 100,ListenerEntries: "hello",Listeners: "world",Logging: struct {
 Info  string `json:"info"`
 Protocol string `json:"protocol"`
 Errlog string `json:"error"`
 Debug string `json:"debug"`
 }{
 Info:"good",Protocol: "story",Errlog: "shenqi",Debug: "shuma",},}

說明

匿名 struct 直接初始化的時候是需要給出它的結構的。

初始化方式二

上述巢狀匿名結構體初始化賦值的示例程式碼片

 var user2 debugConfig
 user2.MaxQueueDepth = 100
 user2.ListenerEntries = "hello"
 user2.Listeners = "world"
 user2.Logging.Info = "good"
 user2.Logging.Protocol = "story"
 user2.Logging.Errlog = "shenqi"
 user2.Logging.Debug = "shuma"

說明

這種方式寫起來更清晰省事兒~

補充:golang 使用匿名結構體的問題

golang允許使用匿名結構體,形如

type Test struct {
  param1 struct {
    param2 string
  }
}

一般在使用的時候可以直接這樣初始化

a := Test{
 param1: struct{ param2 string }{param2: "test"},}

或者

b := new(Test)

b.param1.param2 = "test"   

但今天遇到一種情況

匿名結構體的成員上有tag宣告,形如

type Test struct {
  param1 struct {
    param2 string `json:"param2"`
  }
}

這時使用第一種初始化方式,始終報錯,說型別不匹配,查了很久,偶然情況下去掉了結構體定義中的tag宣告,居然不報錯了,這時反應過來,使用第一種初始化方式,必須保證跟定義完全一樣,包括tag宣告等

a := Test{
 param1: struct{ param2 string `json:"param2"` }{param2: "test"},}

這樣就沒問題了~

最後覺得如果遇到這種匿名結構體,還是使用第二種初始化方式簡潔方便。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。