Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Perbincangan mendalam tentang beberapa konsep utama dan penggunaan petunjuk kaedah Go

Perbincangan mendalam tentang beberapa konsep utama dan penggunaan petunjuk kaedah Go

PHPz
PHPzasal
2023-04-25 10:42:18612semak imbas

Dalam bahasa Go, kaedah ialah fungsi terikat pada jenis tertentu dan boleh dipanggil melalui tika jenis itu. Go boleh menentukan kaedah untuk sebarang jenis, termasuk jenis tersuai (struktur, antara muka) dan jenis terbina dalam (rentetan, tatasusunan, dll.), dan juga jenis penunjuk.

Dalam Go, penunjuk juga merupakan jenis. Jenis penunjuk boleh menunjuk kepada mana-mana jenis pembolehubah, dan nilai pembolehubah boleh diubah suai melalui penunjuk. Oleh itu, dalam Go, kaedah juga boleh ditakrifkan pada jenis penunjuk.

Di bawah ini kita akan membincangkan secara mendalam beberapa konsep utama dan penggunaan petunjuk kaedah Go.

Jenis nilai dan jenis penunjuk

Mari kita lihat contoh dahulu dan tentukan struktur Person:

type Person struct {
    Name string
    Age  int
}

Sekarang kita boleh menentukan terimaPerson Jenis kaedah parameter:

func (p Person) ChangeName(name string) {
    p.Name = name
}

Perhatikan bahawa p di sini ialah nilai jenis Person, bukan penunjuk. Jadi apabila kita memanggil kaedah di atas, nilai Person baharu dicipta dan pengubahsuaian tidak menjejaskan pembolehubah asal.

person := Person{Name: "张三", Age: 20}
person.ChangeName("李四")
fmt.Println(person.Name) // 输出 "张三"

Untuk mengelakkan situasi ini, kita boleh menentukan kaedah yang menerima Person jenis penunjuk, supaya apabila pembolehubah Person diubah suai di dalam kaedah, pembolehubah Person baharu tidak akan dibuat. Sebaliknya, ubah suai pembolehubah Person asal secara langsung.

func (p *Person) ChangeName(name string) {
    p.Name = name
}

person := &Person{Name: "张三", Age: 20}
person.ChangeName("李四")
fmt.Println(person.Name) // 输出 "李四"

Anda boleh melihat bahawa apabila kami mentakrifkan person sebagai pembolehubah penunjuk yang menunjuk kepada jenis Person dan menggunakan kaedah jenis penunjuk ChangeName() untuk mengubah suai atribut Name, yang asal Person Atribut Name pembolehubah akan diubah suai.

Perbezaan antara kaedah penunjuk dan kaedah nilai

Dalam bahasa Go, sebagai tambahan kepada keupayaan yang dinyatakan di atas untuk mengubah suai nilai pembolehubah, terdapat beberapa perbezaan lain antara kaedah nilai dan kaedah penunjuk.

Pertama sekali, kaedah penunjuk boleh mengubah suai penerima (jenis itu sendiri), manakala kaedah nilai tidak boleh.

type Counter struct {
    count int
}

func (c *Counter) Add() {
    c.count++
}

func (c Counter) Get() int {
    return c.count
}

counter := Counter{count: 0}
counter.Add()
fmt.Println(counter.Get()) // 输出 1

Dalam kod di atas, kaedah Add() ialah kaedah penunjuk yang digunakan untuk menambah nilai pembilang, manakala kaedah Get() ialah kaedah nilai yang digunakan untuk mendapatkan nilai pembilang. . Seperti yang anda lihat, dalam kod, kami mula-mula memanggil kaedah Add() untuk menambah nilai pembilang, dan kemudian memperoleh nilai pembilang melalui kaedah Get().

Perbezaan lain ialah apabila menggunakan jenis penunjuk sebagai penerima, peruntukan memori semasa menyalin jenis boleh dielakkan, yang boleh meningkatkan prestasi program.

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

person := &Person{Name: "张三", Age: 20}
person.ChangeAge(21)

Dalam kod di atas, kaedah ChangeAge() ialah kaedah penunjuk yang digunakan untuk mengubah suai atribut Person pembolehubah Age. Memandangkan Person ialah jenis struktur, peruntukan memori berlaku setiap kali pembolehubah jenis nilai diluluskan. Walau bagaimanapun, jika anda mentakrifkan kaedah ChangeAge() sebagai kaedah penunjuk, anda boleh mengelakkan peruntukan memori daripada berlaku.

Kaedah jenis penunjuk bukan jenis penuding

Dalam bahasa Go, jika kaedah ditakrifkan pada jenis penuding, tetapi kami memanggil kaedah menggunakan jenis bukan penuding, pengkompil akan secara automatik menukarnya kepada panggilan jenis penunjuk.

func (p *Person) ChangeName(name string) {
    p.Name = name
}

person := Person{Name: "张三", Age: 20}
person.ChangeName("李四")
fmt.Println(person.Name) // 输出 "李四"

Dalam kod di atas, kami mentakrifkan person sebagai pembolehubah jenis nilai, tetapi mengubah suai nilai pembolehubah melalui kaedah ChangeName(). Dalam kes ini, pengkompil secara automatik menukar person kepada jenis penuding dan memanggil kaedah ChangeName().

Ringkasan

Dalam bahasa Go, penggunaan jenis dan kaedah penunjuk adalah sangat biasa. Dengan mencipta kaedah jenis penunjuk baharu, kita boleh mengelakkan peruntukan memori semasa menyalin jenis. Pada masa yang sama, kaedah penunjuk juga boleh mengubah suai penerima. Selain itu, apabila memanggil kaedah jenis penunjuk menggunakan jenis bukan penunjuk, pengkompil secara automatik menukar panggilan kepada jenis penunjuk. Oleh itu, semasa menulis kod Go, adalah disyorkan untuk menggunakan jenis dan kaedah penunjuk secara fleksibel untuk prestasi dan struktur program yang lebih baik.

Atas ialah kandungan terperinci Perbincangan mendalam tentang beberapa konsep utama dan penggunaan petunjuk kaedah 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
Artikel sebelumnya:Cara membina Rtmp golangArtikel seterusnya:Cara membina Rtmp golang