Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah cara saya mengatasi kaedah struct terbenam dalam Go?

Bagaimanakah cara saya mengatasi kaedah struct terbenam dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-10-26 14:08:31375semak imbas

How do I override an embedded struct's method in Go?

Mengatasi Kaedah Struktur Terbenam dalam Go

Apabila membenamkan struct dalam Go, kaedah struct terbenam tersedia sebagai ahli peringkat atasan struktur benam. Ini membolehkan akses mudah kepada fungsi struct terbenam. Walau bagaimanapun, jika struct benam melaksanakan kaedahnya sendiri dengan nama yang sama, kaedah struct terbenam akan disembunyikan.

Pertimbangkan contoh berikut:

<code class="go">package main

import "fmt"

type Base struct {
    val int
}
func (b *Base)Set(i int) {
    b.val = i
}
type Sub struct {
    Base
    changed bool
}

func (b *Sub)Set(i int) {
    b.val = i
    b.changed = true
}
func main() {
    s := &Sub{}
    s.Base.Set(1)
    var b *Base = &s.Base
    fmt.Printf("%+v\n", b)
    fmt.Printf("%+v\n", s)
}</code>

Dalam contoh ini, Sub struct membenamkan struct Base. Struktur Asas mempunyai kaedah Set, yang disembunyikan oleh kaedah Set Sub struct sendiri. Apabila s.Base.Set(1) dipanggil, kaedah Set struct Base digunakan, bukan kaedah Set Sub struct.

Untuk mengatasi kaedah struct terbenam dalam struct benam, anda hanya boleh memanggil struct terbenam. kaedah struct dari dalam kaedah struct embedding. Sebagai contoh, kod berikut akan mengatasi kaedah Set struct Base dalam Sub struct:

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

Dengan perubahan ini, apabila s.Set(1) dipanggil, kaedah Set Sub struct akan digunakan, yang akan memanggil kaedah Set struct Base dan juga menetapkan medan yang diubah kepada benar. Ini membolehkan anda mengatasi kelakuan kaedah struct terbenam sambil masih mempunyai akses kepada kefungsian struct terbenam.

Atas ialah kandungan terperinci Bagaimanakah cara saya mengatasi kaedah struct terbenam dalam Go?. 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