Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Anda Boleh Mengatasi Kaedah Struktur Terbenam di Golang?

Bagaimanakah Anda Boleh Mengatasi Kaedah Struktur Terbenam di Golang?

Patricia Arquette
Patricia Arquetteasal
2024-10-27 08:55:30798semak imbas

How Can You Override Embedded Struct Methods in Golang?

Mengatasi Kaedah Struktur Terbenam dalam Golang

Di Golang, apabila struct membenamkan struct lain (dirujuk sebagai benam), medan struct terbenam dan kaedah menjadi boleh diakses terus kepada struct pembenaman. Walau bagaimanapun, jika struct benam mentakrifkan semula kaedah daripada struct terbenam, ia boleh mengatasi kaedah asal.

Pertimbangkan kod berikut:

<code class="go">type Base struct {
    val int
}
func (b *Base) Set(i int) {
    b.val = i
}
type Sub struct {
    Base
    changed bool
}</code>

Kami telah membenamkan Base ke Sub. Sekarang, jika kami cuba mengakses kaedah Set Base daripada Sub, ia akan disembunyikan oleh kaedah Set Sub sendiri:

<code class="go">func t16() {
    s := &Sub{}
    // This calls Base's Set method
    s.Base.Set(1) 
    // This causes an error, as s.Set hides Base's Set
    s.Set(10) 
}</code>

Untuk mengatasi tingkah laku ini, kami boleh mentakrifkan semula kaedah Set Sub untuk memanggil kaedah Set Base secara eksplisit:

<code class="go">func (b *Sub) Set(i int) {
    b.Base.Set(i)
    b.changed = true
}</code>

Kini, apabila kami memanggil s.Set(), ia akan menggunakan kaedah Set Base sambil masih membenarkan kami menjejaki perubahan dalam Sub.

<code class="go">func t16() {
    s := &Sub{}
    // Calls Sub's overridden Set method
    s.Set(10) 
    fmt.Printf("%+v\n", s) // Output: {Base:{val:10} changed:true}
}</code>

Kaedah ini membolehkan anda untuk mengatasi kaedah struct terbenam sambil mengekalkan akses kepada kaedah asal melalui medan struct terbenam.

Atas ialah kandungan terperinci Bagaimanakah Anda Boleh Mengatasi Kaedah Struktur Terbenam di Golang?. 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