GoPointer指針是什么

這篇文章主要講解了“Go Pointer指針是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Go Pointer指針是什么”吧!

創(chuàng)新互聯(lián)公司是一家專業(yè)提供尼木企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都做網(wǎng)站、H5場景定制、小程序制作等業(yè)務(wù)。10年已為尼木眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

1. 什么是指針?

指針是存儲(chǔ)其指向地址的變量。特定類型的指針只能指向該類型(數(shù)據(jù)類型不可變)。

2. GoLang 指針語法

指針的語法非常簡單。以下是 Go 中指針聲明的語法。

var ptr *typevar ptrint *int     // 指向 int 的指針

指針的零值是 nil

3. Go 中指針的初始化

類型的指針使用 & 對(duì)其進(jìn)行初始化:

package mainimport (
    "fmt")func main() {
    var q int = 42
    var p *int     // declare the pointer
    p = &q         // initialize the pointer
    fmt.Println(p)  // 0x40e020}

4. Go 指針取值

指針取值意味著獲取指針保存的地址內(nèi)的值。下面是使用 * 運(yùn)算符執(zhí)行指針取值操作的示例:

package mainimport (
    "fmt")func main() {
    var q int = 42
    var p *int
    p = &q
    fmt.Println(p)  // 0x40e020
    fmt.Println(*p) // 42}

5. GoLang 中指針的指針

指針的地址為一個(gè)數(shù)值,此數(shù)值也可以被賦值給其他變量。因此,我們可以創(chuàng)建間接級(jí)別。這些間接級(jí)別有時(shí)會(huì)產(chǎn)生不必要的混淆,所以請謹(jǐn)慎使用。

package mainimport (
    "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. 指向接口的指針

指針可以指向任何東西,甚至可以指向接口。當(dāng)使用空接口時(shí),返回的值為 nil。

package mainimport (
    "fmt")func main() {   
    var a interface{}
    b := &a
    fmt.Println(b)    // 0x40c138
    fmt.Println(*b)   // <nil>}

下面是一個(gè)使用帶有指針接口的例子。

package mainimport (
    "fmt")// 定義接口type Bird interface{
    fly()}type B struct{
    name string}// 實(shí)現(xiàn)它func (b B)fly() {
    fmt.Println("Flying...")}func main() {   
    var a Bird = B{"Peacock"}
    b := &a
    fmt.Println(b)    // 0x40c138
    fmt.Println(*b)   // {Peacock}}

這里 “a”是一個(gè) struct 類型的 Bird,然后用于接口類型,如您所見。這就是多態(tài)的使用。Go 允許使用 接口來實(shí)現(xiàn)多態(tài). 因此,您可以看到指向結(jié)構(gòu)或接口的指針是 Go 中必不可少的工具。

7. 指針作為函數(shù)參數(shù)

指針可以在 函數(shù)  中作為參數(shù)使用。與直接使用值相比,它有一些優(yōu)勢。使用指針作為參數(shù)是將大對(duì)象傳遞給函數(shù)的一種非常有效的方式。因此,使用它是一個(gè)巨大的優(yōu)化。

package mainimport (
    "fmt")//聲明指針參數(shù)func f(a *int) {
    fmt.Println(*a)}func main() {   
    var a int = 42

    // 傳遞地址
    f(&a) // 42}

使用大型對(duì)象可以減緩執(zhí)行時(shí)間,這是將指針傳遞給結(jié)構(gòu)體的示例。這是處理大對(duì)象的有效方法。

package mainimport (
    "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}

取消引用結(jié)構(gòu)時(shí)要小心。如果您使用它像*structname.field1那么它會(huì)拋出錯(cuò)誤。 正確的方法是(*structname).field1

在函數(shù)內(nèi)部使用指針會(huì)使值「可變」,除非它的參數(shù)為 const,因此,每當(dāng)我們想要更改一個(gè)值時(shí),我們應(yīng)該使用指向該值的指針作為函數(shù)參數(shù),然后進(jìn)行必要的修改。

8. Go 中的「new」函數(shù)

Go 中的 new函數(shù)返回一個(gè)指向類型的指針。

package mainimport (
    "fmt")func main() {   
    ptri := new(int)
    *ptri = 67

    fmt.Println(ptri)  // 0x40e020
    fmt.Println(*ptri) // 67}

9. 從函數(shù)返回指針

可以像其他值一樣從函數(shù)返回任何類型的指針。這真的很簡單。我們不直接返回值,而是返回該值的地址。

package mainimport (
    "fmt")func p() *int {  // 將返回類型指定為指針
    v := 101

    // 返回地址
    return &v}func main() {   
    n := p()
    fmt.Println(n)  // 0x40e020
    fmt.Println(*n) // 101}

10. 指向函數(shù)的指針

指向函數(shù)的指針在 Go 中是隱式工作的。這意味著我們不需要將其聲明為指針。

package mainimport (
    "fmt")func main() {       
    f := func() {
        fmt.Println("a function")   
    }
    pf := f    pf() // 一個(gè)函數(shù)}

感謝各位的閱讀,以上就是“Go Pointer指針是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Go Pointer指針是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

文章標(biāo)題:GoPointer指針是什么
文章轉(zhuǎn)載:http://bm7419.com/article12/gegdgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、外貿(mào)網(wǎng)站建設(shè)做網(wǎng)站、電子商務(wù)企業(yè)網(wǎng)站制作、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)