最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言基礎(chǔ)學(xué)習(xí)之指針詳解

 更新時間:2022年12月30日 14:25:36   作者:程序員祝融  
Go 語言中指針是很容易學(xué)習(xí)的,Go 語言中使用指針可以更簡單的執(zhí)行一些任務(wù)。所以本文就來和大家聊聊Go語言中指針的定義與使用,需要的可以參考一下

今天來說說 Go 語言基礎(chǔ)中的指針。

Go 語言中指針是很容易學(xué)習(xí)的,Go 語言中使用指針可以更簡單的執(zhí)行一些任務(wù)。

1. 什么是指針

Go 語言中,一個指針變量指向了一個值的內(nèi)存地址。和 C、C++ 中的指針不同,Go 語言中的指針不能進行計算和偏移操作。

Go 語言中的函數(shù)傳參都是值拷貝,當(dāng)我們想要修改某個變量的時候,我們可以創(chuàng)建一個指向該變量地址的指針變量。傳遞數(shù)據(jù)使用指針,而無須拷貝數(shù)據(jù)。

Go 語言中的指針操作非常簡單,只有記住兩個符號就可以了。

  • &(取地址)
  • *(根據(jù)地址取值)
var ip *int /* 指向整型*/

畫個重點,我們想徹底搞明白指針,必須要掌握 3 個概念:

  • 指針地址
  • 指針類型
  • 指針取值

接下來我們從這 3 點大家闡述 Go 語言指針,方便大家掌握。

2. 指針地址 & 指針類型

Go 語言變量在運行時都會被指定一個內(nèi)存地址,即變量在內(nèi)存中的位置。Go 語言通常在使用時會在變量前放一個 & 代表對變量進行 “ 取地址 ” 操作。Go 語言常用的值類型 (string、int、array、struct、float、bool )都會有對應(yīng)的指針類型。如:string、 int、*int64 等。

每個變量在運行時都擁有一個地址,這個地址代表變量在內(nèi)存中的位置。Go語言中使用&字符放在變量前面對變量進行“取地址”操作。 Go語言中的值類型(int、float、bool、string、array、struct)都有對應(yīng)的指針類型,如:int、int64、*string等。

取變量指針的語法如下:

package main

import "fmt"

func main(){
        
    a := 10   /* 聲明實際變量 */
    ip := &a  /* 指針變量的存儲地址 */
    
    
    fmt.Printf("a 變量的地址是: %x\n", &a  )
    
    /* 指針變量的存儲地址 */
    fmt.Printf("ip 變量儲存的指針地址: %x\n", ip )
    
    /* 使用指針訪問值 */
    fmt.Printf("*ip 變量的值: %d\n", *ip )
}

運行結(jié)果:

a 變量的地址是: 0xc000010200

ip 變量儲存的指針地址: 0xc000010200

*ip 變量的值: 10

其中:

  • a: 代表被取地址的變量,類型為 int
  • ip: 用于接收地址的變量,ip 的類型就為 *int,稱做 int 的指針類型。*代表指針。

用圖來表示一下 ip := &a:

以上就是指針地址和指針類型。

3. 指針取值

對變量使用 &會獲取該變量的指針,對指針使用 * 會獲取到值,也就是 “指正取值”。舉個例子更好的理解一下:

package main

import "fmt"

func main() {
    
    a := 20   /* 聲明實際變量 */
    b := &a  /* 指針變量的存儲地址 */
    fmt.Printf("type of b:%T\n", &a  )
    
    c := *b // 指針取值(根據(jù)指針去內(nèi)存取值)
    fmt.Printf("type of c:%T\n", c)
    fmt.Printf("value of c:%v\n", c)
}

控制臺輸出結(jié)果:

type of b:*int
type of c:int
value of c:10

小結(jié)一下:

  • 指針變量的值是指針地址 (可以結(jié)合上圖更好的理解)
  • 對變量進行取地址 &操作,可以獲得這個變量的指針變量
  • 對指針變量進行取值 *操作,可以獲得指針變量指向的原變量的值

函數(shù)傳值:

package main

import "fmt"

func main() {
    
    x := 2
    mod1(x)
    fmt.Println(x) // 2
    
    mod2(&x)
    fmt.Println(x) // 1024
}

func mod1(x int) {
    x = 1024
}

func mod2(x *int) {
    *x = 1024
}

4. 空指針

當(dāng)一個指針被定義后沒有分配到任何變量時,它的值為 nil。

nil 指針也稱為空指針。

nil在概念上和其它語言的 null、None、nil、NULL一樣,都指代零值或空值。

一個指針變量通??s寫為 ptr

舉個例子:

package main

import "fmt"

func main() {
   var  ptr *int
   fmt.Printf("ptr 的值為 : %x\n", ptr) // ptr 的值為 : 0
}

空指針判斷:

package main

import "fmt"

func main() {
    var ptr *string
    fmt.Println(ptr)
    fmt.Printf("ptr的值是%v\n", ptr)
    
    if ptr != nil {
        fmt.Println("非空")
    } 
    if ptr == nil {
        fmt.Println("空值")
    }
}

5. make

make 是用于初始化內(nèi)置的數(shù)據(jù)結(jié)構(gòu),比如 slicemap 和 channel。

func make(t Type, size ...IntegerType) Type

舉個例子:

package main

import "fmt"

func main() {
    var user map[string]int
    user = make(map[string]int, 10)
    user["age"] = 18
    fmt.Println(user)

    /** 
        slice := make([]int, 0, 100)
        hash := make(map[int]bool, 10)
        ch := make(chan int, 5)
    **/
}

6. new

new 的作用是根據(jù)傳入的類型分配一片內(nèi)存空間并返回指向這片內(nèi)存空間的指針。

func new(Type) *Type

解釋一下:

  • Type 表示類型,new 函數(shù)只接受一個參數(shù),這個參數(shù)是一個類型
  • *Type 表示類型指針,new 函數(shù)返回一個指向該類型內(nèi)存地址的指針

舉個例子:

package main

import "fmt"

func main() {
    a := new(int)
    b := new(bool)
    fmt.Printf("%T\n", a) // *int
    fmt.Printf("%T\n", b) // *bool
    fmt.Println(*a)       // 0
    fmt.Println(*b)       // false
}

7. make 和 new 的區(qū)別

面試高頻題,這個要考,記一下。

  • make 和 new 都是用來做內(nèi)存分配
  • make 只用于 slice、map 、channel 的初始化,返回的還是這三個引用類型本身,因為這三種類型就是引用類型,所以就沒必要返回其指針了
  • new 用于類型的內(nèi)存分配,并且內(nèi)存對應(yīng)的值為類型零值,返回的是指向類型的指針。

8. 問題

Q: 執(zhí)行下面的代碼會出現(xiàn)啥問題?

package main

import "fmt"

func main() {
    var a *int
    *a = 100
    fmt.Println(*a)

    var user map[string]int
    user["age"] = 18
    fmt.Println(user)
}

A: 會出現(xiàn) panic runtime error: invalid memory address or nil pointer dereference。出錯行數(shù)在第 7 行。

原因:在 Go 語言中我們使用引用類型的變量需要先申明、分配內(nèi)存空間,否則在賦值是會出錯。值類型的變量除外,因為其在申明時就分配了默認的內(nèi)存空間。這也是 new 和 make 的作用。

到此這篇關(guān)于Go語言基礎(chǔ)學(xué)習(xí)之指針詳解的文章就介紹到這了,更多相關(guān)Go語言指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang 實現(xiàn)struct、json、map互相轉(zhuǎn)化

    golang 實現(xiàn)struct、json、map互相轉(zhuǎn)化

    這篇文章主要介紹了golang 實現(xiàn)struct、json、map互相轉(zhuǎn)化,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang使用DockerFile正確用法指南

    golang使用DockerFile正確用法指南

    docker在開發(fā)和運維中使用的場景越來越多,作為開發(fā)人員非常有必要了解一些docker的基本知識,而離我們工作中最近的也就是對應(yīng)用的docker部署編排了,這篇文章主要給大家介紹了關(guān)于golang使用DockerFile的正確用法指南,需要的朋友可以參考下
    2024-03-03
  • golang語言http協(xié)議get拼接參數(shù)操作

    golang語言http協(xié)議get拼接參數(shù)操作

    這篇文章主要介紹了golang語言http協(xié)議get拼接參數(shù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang定時任務(wù)cron項目實操指南

    golang定時任務(wù)cron項目實操指南

    Go實現(xiàn)的cron 表達式的基本語法跟linux 中的 crontab基本是類似的,下面這篇文章主要給大家介紹了關(guān)于golang定時任務(wù)cron項目實操的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • go項目實現(xiàn)mysql接入及web?api的操作方法

    go項目實現(xiàn)mysql接入及web?api的操作方法

    這篇文章主要介紹了go項目實現(xiàn)mysql接入以及web api,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Go語言調(diào)用其它程序并獲得程序輸出的方法

    Go語言調(diào)用其它程序并獲得程序輸出的方法

    這篇文章主要介紹了Go語言調(diào)用其它程序并獲得程序輸出的方法,實例分析了Go調(diào)用cmd程序的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Golang使用WebSocket通信的實現(xiàn)

    Golang使用WebSocket通信的實現(xiàn)

    這篇文章主要介紹了Golang使用WebSocket通信的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Golang中的閉包(Closures)詳解

    Golang中的閉包(Closures)詳解

    在?Golang?中,閉包是一個引用了作用域之外的變量的函數(shù),Golang?中的匿名函數(shù)也被稱為閉包,閉包可以被認為是一種特殊類型的匿名函數(shù),所以本文就給大家詳細的介紹一下Golang的閉包到底是什么,感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07
  • Go整合ElasticSearch的示例代碼

    Go整合ElasticSearch的示例代碼

    這篇文章主要介紹了Go整合ElasticSearch的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Go開發(fā)go-optioner工具實現(xiàn)輕松生成函數(shù)選項模式代碼

    Go開發(fā)go-optioner工具實現(xiàn)輕松生成函數(shù)選項模式代碼

    go-optioner?是一個在?Go?代碼中生成函數(shù)選項模式代碼的工具,可以根據(jù)給定的結(jié)構(gòu)定義自動生成相應(yīng)的選項代碼,下面就來聊聊go-optioner是如何使用的吧
    2023-07-07

最新評論

嵊泗县| 伊川县| 麻城市| 当涂县| 新竹县| 张家口市| 廊坊市| 永年县| 观塘区| 马关县| 桂阳县| 抚宁县| 乐亭县| 上栗县| 当雄县| 宝山区| 曲水县| 巴林左旗| 罗江县| 怀来县| 吉木萨尔县| 城步| 宜黄县| 洪洞县| 芜湖县| 宿州市| 新疆| 应城市| 蒲江县| 仲巴县| 凉城县| 句容市| 扎囊县| 镶黄旗| 东至县| 商丘市| 连平县| 灵台县| 集安市| 门源| 银川市|