Rumah > Artikel > pembangunan bahagian belakang > Penjelasan terperinci tentang 11 mata pengetahuan tentang petunjuk dalam bahasa Go
Penunjuk ialah salah satu bahagian terpenting dalam menulis kod yang baik. Dalam artikel ini, kami akan meneroka apakah petunjuk itu dan cara menggunakannya dalam Go.
Penunjuk ialah pembolehubah yang menyimpan alamat yang ditunjukkannya kepada (penekanan pada, Hanya pembolehubah yang menyimpan nilai berangka). [Cadangan berkaitan: Tutorial Video Go]
Penunjuk jenis tertentu hanya boleh menunjuk kepada jenis tersebut (jenis data yang ditunjuk oleh penuding tidak boleh diubah).
Sintaks penunjuk adalah sangat mudah. Berikut ialah sintaks untuk pengisytiharan penunjuk dalam Go. Nilai sifar bagi penuding
var ptr *type var ptrint *int // 指向 int 的指针
ialah nihil.
penunjuk jenis &
digunakan untuk memulakannya:
package main import ( "fmt" ) func main() { var q int = 42 var p *int // declare the pointer p = &q // initialize the pointer fmt.Println(p) // 0x40e020 }
Nilai penunjuk bermaksud mendapatkan nilai dalam alamat yang disimpan oleh penunjuk. Berikut ialah contoh menggunakan operator *
untuk melaksanakan operasi nilai penunjuk:
package main import ( "fmt" ) func main() { var q int = 42 var p *int p = &q fmt.Println(p) // 0x40e020 fmt.Println(*p) // 42 }
Alamat penuding ialah nilai, dan nilai ini juga boleh diberikan kepada pembolehubah lain. Oleh itu, kita boleh mencipta tahap tidak arah. Tahap kelalaian ini kadangkala boleh menimbulkan kekeliruan yang tidak perlu, jadi gunakannya dengan berhati-hati.
package main import ( "fmt" ) func main() { i := 64 j := &i // j 是 int 类型的指针 k := &j // k 是存放指针地址的指针,也是 int 类型 fmt.Println(i) // 64 fmt.Println(j) // 0x40e020 fmt.Println(*j) // 64 (value inside that address) fmt.Println(k) // 0x40c138 fmt.Println(*k) // 0x40e020 (address of j) }
Penunjuk boleh menunjuk ke apa-apa sahaja, malah ke antara muka. Apabila menggunakan antara muka kosong, nilai yang dikembalikan ialah nihil.
package main import ( "fmt" ) func main() { var a interface{} b := &a fmt.Println(b) // 0x40c138 fmt.Println(*b) // <nil> }
Berikut ialah contoh penggunaan antara muka dengan penunjuk.
package main import ( "fmt" ) // 定义接口 type Bird interface{ fly() } type B struct{ name string } // 实现它 func (b B)fly() { fmt.Println("Flying...") } func main() { var a Bird = B{"Peacock"} b := &a fmt.Println(b) // 0x40c138 fmt.Println(*b) // {Peacock} }
Di sini "a" ialah struktur jenis Bird, yang kemudiannya digunakan untuk jenis antara muka, seperti yang anda boleh lihat. Ini adalah penggunaan polimorfisme. Go membolehkan polimorfisme dilaksanakan menggunakan antara muka Jadi anda boleh melihat bahawa penunjuk kepada struktur atau antara muka ialah alat penting dalam Go.
Penunjuk boleh digunakan sebagai parameter dalam fungsi . Ia mempunyai beberapa kelebihan berbanding menggunakan nilai secara langsung. Menggunakan penunjuk sebagai hujah ialah cara yang sangat berkesan untuk menghantar objek besar kepada fungsi. Jadi menggunakannya adalah pengoptimuman yang besar.
package main import ( "fmt" ) //声明指针参数 func f(a *int) { fmt.Println(*a) } func main() { var a int = 42 // 传递地址 f(&a) // 42 }Menggunakan objek besar boleh melambatkan masa pelaksanaan, ini adalah contoh menghantar penunjuk kepada struct. Ini adalah cara yang cekap untuk mengendalikan objek besar.
package main import ( "fmt" ) type Human struct { name string age int place string } func f(h *Human) { fmt.Println("The user", (*h).name, "is", (*h).age, "years old and he is from", (*h).place) } func main() { john := Human{"John", 36, "Las Vegas"} f(&john) // The user John is 36 years old and he is from Las Vegas }Berhati-hati apabila menafikan struktur. Jika anda menggunakannya seperti
yang betul *structname.field1
ialah . (*structname).field1
Menggunakan penunjuk di dalam fungsi menjadikan nilai "
" melainkan hujahnya const, jadi apabila kita ingin menukar nilai, Kita harus menggunakan penunjuk untuk nilai sebagai parameter fungsi dan kemudian mengubahnya mengikut keperluan.
8. Fungsi "baharu" dalam Godalam Go mengembalikan penunjuk kepada jenis.
package main import ( "fmt" ) func main() { ptri := new(int) *ptri = 67 fmt.Println(ptri) // 0x40e020 fmt.Println(*ptri) // 67 }
package main import ( "fmt" ) func p() *int { // 将返回类型指定为指针 v := 101 // 返回地址 return &v } func main() { n := p() fmt.Println(n) // 0x40e020 fmt.Println(*n) // 101 }
package main import ( "fmt" ) func main() { f := func() { fmt.Println("a function") } pf := f pf() // 一个函数 }
Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati:
Atas ialah kandungan terperinci Penjelasan terperinci tentang 11 mata pengetahuan tentang petunjuk dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!