首页 >后端开发 >Golang >构造函数如何解决初始化 Go 结构体时出现的 Nil 指针恐慌?

构造函数如何解决初始化 Go 结构体时出现的 Nil 指针恐慌?

Barbara Streisand
Barbara Streisand原创
2024-12-01 06:39:09563浏览

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

在 Go 中使用构造函数初始化结构体成员

初始化结构体成员可能具有挑战性,尤其是对于初学者而言。让我们深入研究一个问题,即创建一个新的结构体实例(“sm”)并在其上调用函数(“sm.Put”)会因 nil 指针而导致恐慌。

问题:

<br>导入“同步”</p>
<p>类型SyncMap struct {</p>
<pre class="brush:php;toolbar:false">    lock *sync.RWMutex
    hm map[string]string

}
func (m *SyncMap) Put (k, v string) {

    m.lock.Lock()
    defer m.lock.Unlock()

    m.hm[k] = v, true

}

func main() {

    sm := new(SyncMap)
    sm.Put("Test, "Test") // Panic

}

此代码失败,因为 lock 和 hm 字段都未初始化。

解决方法(不是理想):

一种解决方法是添加 Init 函数并手动创建实例后初始化字段:

<br>func (m *SyncMap) Init() {<pre class="brush:php;toolbar:false">    m.hm = make(map[string]string)
    m.lock = new(sync.RWMutex)

}

优雅的解决方案:使用构造函数

更好的方法是使用构造函数来初始化结构体:

<br>func NewSyncMap() *SyncMap {<pre class="brush:php;toolbar:false">return &amp;SyncMap{hm: make(map[string]string)}

}

作者调用 NewSyncMap(),可以创建一个带有初始化成员的新实例。

高级构造函数:

对于更复杂的结构体,构造函数可以执行其他初始化任务,例如启动 goroutine 或注册终结器:

<br>func NewSyncMap() *SyncMap {<pre class="brush:php;toolbar:false">sm := SyncMap{
    hm: make(map[string]string),
    foo: "Bar",
}

runtime.SetFinalizer(sm, (*SyncMap).stop)

go sm.backend()

return &amp;sm

}

结论:

构造函数提供了一个优雅且灵活的初始化结构体成员的方法。通过利用它们,您可以简化新结构实例的创建,消除零指针恐慌,并简化复杂数据结构的初始化过程。

以上是构造函数如何解决初始化 Go 结构体时出现的 Nil 指针恐慌?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn