Rumah  >  Artikel  >  pembangunan bahagian belakang  >  penunjuk hadapan kaedah golang

penunjuk hadapan kaedah golang

PHPz
PHPzasal
2023-05-14 15:28:37522semak imbas

Dalam bahasa Go, kita boleh menambah gelagat pada objek melalui kaedah. Apabila mentakrifkan kaedah, kita boleh menentukan penerima Penerima boleh menjadi jenis nilai (seperti int, float) atau jenis penunjuk (seperti int, float), yang menentukan sama ada untuk menggunakan hantaran nilai atau. Hantaran penunjuk. Menggunakan penunjuk sebelum nama kaedah dipanggil penunjuk sebelum kaedah. Artikel ini akan meneroka kelebihan, keburukan dan senario penggunaan menggunakan penunjuk sebelum kaedah.

Apakah itu penunjuk pra-kaedah?

Dalam bahasa Go, mengisytiharkan kaedah boleh menjadi seperti ini:

func (s Struct) method() {}

func (s *Struct) pointerMethod() {}

Penerima kaedah pertama ialah jenis nilai, dan penerima kaedah pertama adalah jenis nilai Penerima kedua-dua kaedah adalah jenis penunjuk.

Menggunakan penunjuk sebelum nama kaedah kaedah kedua dipanggil penunjuk pra kaedah.

Kelebihan penunjuk sebelum kaedah

1. Nilai penerima boleh diubah suai

Penunjuk sebelum kaedah boleh mengubah suai nilai yang ditunjukkan oleh penerima, tetapi jenis nilai tidak boleh.

type Person struct {
    Name string
    Age int
}

func (p *Person) SetAge(age int)  {
    p.Age = age
}

func main() {
    p := &Person{Name: "Bob", Age: 20}
    fmt.Printf("Before: %v
", p.Age)

    p.SetAge(25)
    fmt.Printf("After: %v
", p.Age)
}

Output:

Before: 20
After: 25

2. Penyalinan objek besar boleh dielakkan

Apabila menggunakan jenis nilai sebagai penerima, kaedah akan menyalin keseluruhan objek. Apabila menggunakan jenis penunjuk sebagai penerima, kaedah hanya menyalin penunjuk. Oleh itu, apabila menggunakan jenis penuding sebagai penerima, anda boleh mengelakkan masalah prestasi yang disebabkan oleh objek besar yang disalin.

type BigStruct struct {
    Data [1000000]int
}

func (s *BigStruct) method() {}

func main() {
    b := BigStruct{}
    b.method()
}

Apabila menggunakan jenis nilai sebagai penerima, memanggil kaedah method akan menyalin keseluruhan objek BigStruct, menyebabkan masalah prestasi. Menggunakan jenis penunjuk sebagai penerima boleh mengelakkan masalah ini.

Kelemahan penunjuk sebelum kaedah

1 Boleh menyebabkan pengecualian penunjuk nol

Apabila menggunakan jenis penunjuk sebagai penerima, anda perlu menyemak sama ada penerima adalah penunjuk nol . Jika tidak, NullPointerException akan berlaku apabila beroperasi pada penerima dalam kaedah tersebut.

type Person struct {
    Name string
    Age int
}

func (p *Person) SetAge(age int)  {
    if p == nil {
        return
    }
    p.Age = age
}

func main() {
    var p *Person
    p.SetAge(25)
}

Dalam kod di atas, p.SetAge(25) akan mencetuskan pengecualian penuding nol kerana p ialah penuding nol. Oleh itu, anda perlu memberi perhatian untuk menyemak keadaan penunjuk nol apabila menggunakan penunjuk sebelum kaedah.

2. Boleh menjejaskan kebolehbacaan kod

Menggunakan jenis penunjuk sebagai penerima boleh menyebabkan kod sukar difahami dan terdedah kepada kesamaran.

func (s *Struct) method() {}

func (s *Struct) pointerMethod() {}

func main() {
    s := Struct{}
    s.pointerMethod()
}

Dalam kod di atas, s.pointerMethod() boleh menyebabkan pembaca bertanya: Mengapa kaedah penunjuk dipanggil apabila menggunakan jenis nilai?

Kesimpulan

Dalam bahasa Go, menggunakan penunjuk sebelum kaedah mempunyai kelebihan dan kekurangannya.

Apabila menggunakan jenis penunjuk sebagai penerima, anda boleh mengubah suai nilai yang ditunjuk oleh penerima, mengelakkan penyalinan objek besar, dsb. Walau bagaimanapun, ia juga boleh menyebabkan masalah seperti pengecualian penuding nol dan menjejaskan kebolehbacaan kod.

Oleh itu, apabila menggunakan penunjuk hadapan kaedah, anda perlu menimbang kelebihan dan kekurangan serta memilih kaedah yang sesuai dengan anda. Jika anda perlu mengubah suai nilai yang ditunjukkan oleh penerima, atau mengelakkan penyalinan objek besar, anda boleh menggunakan jenis penunjuk sebagai penerima jika tidak, anda boleh menggunakan jenis nilai sebagai penerima.

Atas ialah kandungan terperinci penunjuk hadapan kaedah 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