首頁 > 後端開發 > Golang > 建構函式如何解決初始化 Go 結構體時出現的 Nil 指標恐慌?

建構函式如何解決初始化 Go 結構體時出現的 Nil 指標恐慌?

Barbara Streisand
發布: 2024-12-01 06:39:09
原創
466 人瀏覽過

How Can Constructors Solve Nil Pointer Panics When Initializing Go Structs?

在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
登入後複製
類型SyncMap

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 &amp;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 &amp;sm
登入後複製
<p>func NewSyncMap() *SyncMap {<br></p><p>}<strong></strong></p>
登入後複製

結論:

構造函數提供了一個優雅且靈活的初始化結構體成員的方法。透過利用它們,您可以簡化新結構實例的創建,消除零指標恐慌,並簡化複雜資料結構的初始化過程。

以上是建構函式如何解決初始化 Go 結構體時出現的 Nil 指標恐慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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