在Go 中使用建構函式初始化結構體成員
初始化結構體成員可能具有挑戰性,尤其是對於初學者而言。讓我們深入研究一個問題,即創建一個新的結構體實例(“sm”)並在其上調用函數(“sm.Put”)會因 nil 指標而導致恐慌。
問題:
<br>導入「同步」<p>型 SyncMap {</p><pre class="brush:php;toolbar:false"> lock *sync.RWMutex hm map[string]string
類型SyncMap struct {
m.lock.Lock() defer m.lock.Unlock() m.hm[k] = v, true
func (m *SyncMap) Put (k, v string) {
}sm := new(SyncMap) sm.Put("Test, "Test") // Panic
func main() {
}
此程式碼失敗,因為lock 和hm 欄位都未初始化。
解決方法(不是理想):
一種解決方法是添加Init 函數並手動建立實例後初始化欄位:
m.hm = make(map[string]string) m.lock = new(sync.RWMutex)
<p>func (m *SyncMap) Init() {<br></p><p>}<strong></strong></p>
優雅的解決方案:使用建構子
更好的方法是使用建構子來初始化結構體:
return &SyncMap{hm: make(map[string]string)}
<p>func NewSyncMap() *SyncMap {<br></p> <p>}</p>
作者呼叫 NewSyncMap(),可以建立一個有初始化成員的新實例。
高階建構子:
對於更複雜的結構體,建構函式可以執行其他初始化任務,例如啟動goroutine 或註冊終結器:
sm := SyncMap{ hm: make(map[string]string), foo: "Bar", } runtime.SetFinalizer(sm, (*SyncMap).stop) go sm.backend() return &sm
<p>func NewSyncMap() *SyncMap {<br></p><p>}<strong></strong></p>
結論:
構造函數提供了一個優雅且靈活的初始化結構體成員的方法。透過利用它們,您可以簡化新結構實例的創建,消除零指標恐慌,並簡化複雜資料結構的初始化過程。以上是建構函式如何解決初始化 Go 結構體時出現的 Nil 指標恐慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!