Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk mencipta nilai daripada penunjuk nil

Bagaimana untuk mencipta nilai daripada penunjuk nil

PHPz
Lepaskan: 2024-02-09 10:50:09
ke hadapan
1012 orang telah melayarinya

如何从 nil 指针创建值

Editor PHP Youzi akan memperkenalkan anda cara mencipta nilai daripada penunjuk sifar. Dalam pengaturcaraan, penunjuk nil ialah penunjuk yang tidak menunjuk kepada mana-mana alamat memori yang sah. Biasanya, kita tidak boleh mencipta nilai daripada penuding nol kerana ia tidak menghala ke mana-mana ruang memori yang sah. Walau bagaimanapun, sesetengah bahasa pengaturcaraan menyediakan pengendalian khas yang membolehkan kami mencipta nilai dari penunjuk nol. Dalam artikel ini, kita akan membincangkan cara mengendalikan situasi khusus ini dan cara mengelakkan masalah dan ralat yang berpotensi. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini akan memberikan anda bimbingan dan nasihat yang berguna.

Kandungan soalan

Dalam Go 1.19, pertimbangkan definisi berikut:

type A struct{}
type B struct{}

type Field interface {
    *A | *B
}

type Person[T Field] struct {
    field T
}
Salin selepas log masuk

Memandangkan tiada Field, bolehkah saya mencipta nilai asasnya secara dinamik?

func (p Person[T]) do() {
  if p.field == nil {

    // Can I make a value here that will be *A or *B dynamically depending on T?
    // Something that would be equivalent to new(A) or new(B)
    p.field = ?

  }
}
Salin selepas log masuk

Penyelesaian

func (p Person[T]) do() {
    if p.field == nil {
        // assuming T is a pointer type, e.g. *A
        pp := new(T)             // initialize an instance of **A
        rt := reflect.TypeOf(pp) // get the reflect.Type representation of **A
        rt = rt.Elem()           // get the reflect.Type representation of *A
        rt = rt.Elem()           // get the reflect.Type representation of A
        rv := reflect.New(rt)    // initialize reflect.Value representation of *A
        v := rv.Interface()      // get the interface{}(*A) instance from reflect.Value
        t := v.(T)               // type assert the interface's dynamic type
        p.field = t
    }
}
Salin selepas log masuk

https://www.php.cn/link/ccd2d123f4ec4d777fc6ef757d0fb642

Untuk maklumat lanjut, sila lihat dokumentasi:

Atas ialah kandungan terperinci Bagaimana untuk mencipta nilai daripada penunjuk nil. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan