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> <div class="code" style="position:relative; padding:0px; margin:0px;"><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> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return &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 &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!