Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjelasan terperinci tentang 11 mata pengetahuan tentang petunjuk dalam bahasa Go

Penjelasan terperinci tentang 11 mata pengetahuan tentang petunjuk dalam bahasa Go

青灯夜游
青灯夜游ke hadapan
2022-10-27 19:19:093108semak imbas

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.

Penjelasan terperinci tentang 11 mata pengetahuan tentang petunjuk dalam bahasa Go

1. Apakah itu penunjuk

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).

2. Sintaks penunjuk GoLang

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.

3. Inisialisasi penunjuk dalam Go

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
}

4. Nilai penunjuk Go

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
}

5. Penunjuk kepada penunjuk dalam GoLang

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)
}

6. Penunjuk ke antara muka

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.

7. Penunjuk sebagai parameter fungsi

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
maka ia akan menimbulkan ralat. Kaedah

yang betul *structname.field1 ialah . (*structname).field1Menggunakan penunjuk di dalam fungsi menjadikan nilai "

boleh berubah

" 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 Go

Fungsi

baharu

dalam Go mengembalikan penunjuk kepada jenis.

package main

import (
    "fmt"
)

func main() {   
    ptri := new(int)
    *ptri = 67

    fmt.Println(ptri)  // 0x40e020
    fmt.Println(*ptri) // 67
}
9. Mengembalikan penunjuk daripada fungsi

Anda boleh mengembalikan sebarang jenis penunjuk daripada fungsi sama seperti nilai lain. Ia sangat mudah. Kami tidak mengembalikan nilai secara langsung, tetapi alamat nilai tersebut.

package main

import (
    "fmt"
)

func p() *int {  // 将返回类型指定为指针
    v := 101

    // 返回地址
    return &v
}

func main() {   
    n := p()
    fmt.Println(n)  // 0x40e020
    fmt.Println(*n) // 101
}
10. Penunjuk kepada fungsi

Penunjuk kepada fungsi berfungsi secara tersirat dalam Go. Ini bermakna kita tidak perlu mengisytiharkannya sebagai penunjuk.

package main

import (
    "fmt"
)

func main() {       
    f := func() {
        fmt.Println("a function")   
    }
    pf := f
    pf() // 一个函数
}
11. Perkara yang perlu diingat apabila menggunakan penunjuk dalam Go

Aritmetik penunjuk tidak dibenarkan dalam Go. Oleh itu, kami tidak boleh melakukan operasi seperti kenaikan atau penurunan yang sama seperti yang kami boleh dalam C/C.

Kita mungkin mahu menggunakan penuding pada tatasusunan, tetapi menggunakan kepingan ialah pilihan yang lebih baik. Slices jauh lebih serba boleh daripada penunjuk kepada tatasusunan. Kod ini sangat ringkas dan memudahkan kerja kami. Oleh itu, gunakan kepingan apabila boleh.


Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati:

Video Pengaturcaraan

! !

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!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam