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
Lepaskan: 2024-12-01 06:39:09
asal
543 orang telah melayarinya

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
Salin selepas log masuk

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

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

    m.hm[k] = v, true
Salin selepas log masuk

}

func main() {

    sm := new(SyncMap)
    sm.Put("Test, "Test") // Panic
Salin selepas log masuk

}

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)
Salin selepas log masuk

}

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 &amp;SyncMap{hm: make(map[string]string)}
Salin selepas log masuk

}

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
Salin selepas log masuk

}

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!

sumber:php.cn
Artikel sebelumnya:Bagaimanakah Saya Boleh Mengurus Berbilang Direktori GOPATH dengan Berkesan dalam Go? Artikel seterusnya:Bagaimanakah Saya Boleh Mencipta Program Yang Meniru Terminal (TTY) pada Linux dan macOS?
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Isu terkini
Topik-topik yang berkaitan
Lagi>
Cadangan popular
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan