Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Pembina Boleh Menyelesaikan Panik Penunjuk Nil Semasa Memulakan Go Structs?

Bagaimanakah Pembina Boleh Menyelesaikan Panik Penunjuk Nil Semasa Memulakan Go Structs?

Barbara Streisand
Barbara Streisandasal
2024-12-01 06:39:09585semak imbas

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

Menggunakan Pembina untuk Memulakan Ahli Struktur dalam Go

Memulakan ahli struct boleh menjadi mencabar, terutamanya untuk pemula. Mari kita mendalami isu di mana mencipta contoh struct baharu ("sm") dan memanggil fungsi padanya ("sm.Put") mengakibatkan panik kerana penunjuk nol.

Masalah:


import "sync"

taip SyncMap struct {

    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

}

Kod ini gagal kerana kedua-dua medan kunci dan hm tidak dimulakan.

Penyelesaian (Tidak Ideal):

Satu penyelesaian adalah dengan menambah fungsi Init dan mulakan medan secara manual selepas mencipta contoh:

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

}

Penyelesaian Elegan: Menggunakan a Pembina

Pendekatan yang lebih baik ialah menggunakan fungsi pembina untuk memulakan struct:

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

}

Dengan memanggil NewSyncMap(), anda boleh mencipta tika baharu dengan ahli yang dimulakan.

Pembina Lanjutan:

Untuk struct yang lebih kompleks, pembina boleh melakukan yang lain tugas pemula, seperti memulakan goroutine atau mendaftar pemuktamad:


func NewSyncMap() *SyncMap {

sm := SyncMap{
    hm: make(map[string]string),
    foo: "Bar",
}

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

go sm.backend()

return &amp;sm

}

Kesimpulan:

Pembina menyediakan cara yang elegan dan fleksibel untuk memulakan ahli struct . Dengan memanfaatkannya, anda boleh menyelaraskan penciptaan tika struct baharu, menghapuskan panik penunjuk sifar dan memudahkan proses permulaan untuk struktur data yang kompleks.

Atas ialah kandungan terperinci Bagaimanakah Pembina Boleh Menyelesaikan Panik Penunjuk Nil Semasa Memulakan Go Structs?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn