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

go語言指針常見操作方法

 更新時間:2026年05月09日 10:37:10   作者:講不出??再見  
指針是存儲變量內(nèi)存地址的變量,聲明格式為`*T`,指針用于函數(shù)間共享數(shù)據(jù)、傳遞結(jié)構(gòu)體等,本文給大家介紹go語言指針常見操作方法,感興趣的朋友一起看看吧

什么是指針?

指針是存儲一個變量的內(nèi)存地址的,聲明一個指針變量的格式如下:

// ptr是指針變量名,*表示是指針類型,*int表示存儲的是一個int類型變量的內(nèi)存地址
var ptr *int

1、關(guān)鍵操作符

符號名稱作用示例
&取址符獲取變量在內(nèi)存中的地址,返回指針類型ptr := &num (獲取 num 的地址)
*解引用符

1. ‌聲明時‌:表示指針類型(如 *int)

2. ‌使用時‌:獲取或修改指針指向的具體值

val := *ptr (讀取ptr指向的int變量值)

*ptr = 100 (修改ptr指向的int變量值為100)

2、常見操作

package main
import "fmt"
func main() {
    // 1.定義普通變量
    num := 100
    fmt.Printf("普通變量值: %d, 地址: %p\n", num, &num)
    // 2. 聲明并初始化指針
    var ptr *int = &num // ptr 存儲的是 num 的內(nèi)存地址
    // 3. 解引用:讀取和修改
    fmt.Printf("指針指向的值: %d\n", *ptr) // 輸出 100
    *ptr = 200 // 通過指針修改原始變量的值
    fmt.Printf("修改后原始變量值: %d\n", num) // 輸出 200,證明原值被改變
}

3、空指針

當指針變量未初始化時,默認為空指針,nil。

go語言底層將nil視為地址為0的特殊變量。

所以,空指針 ptr == nil 為true,但是在打印ptr指向的內(nèi)存地址時,打印出的是 0x0【就是0】

危險操作:對 nil 指針進行解引用(如 *ptr)會導(dǎo)致程序運行時崩潰(panic: invalid memory address or nil pointer dereference)。

package main
import "fmt"
func main() {
	var ptr *int
	if ptr == nil {
		fmt.Printf("%p", ptr)
	} 
}

4、指針的使用場景

4.1、在函數(shù)間共享數(shù)據(jù)并修改原值

Go 語言默認參數(shù)傳遞是‌值傳遞‌(拷貝副本)。如果希望在函數(shù)內(nèi)部修改外部變量的值,必須傳遞指針。

func increment(ptr *int) {
    *ptr++ // 修改指針指向的原始值
}
func main() {
    count := 10
    increment(&count) // 傳入地址
    fmt.Println(count) // 輸出 11
}

4.2、避免大型數(shù)據(jù)結(jié)構(gòu)的拷貝開銷

對于大型結(jié)構(gòu)體(Struct)或數(shù)組,值傳遞會復(fù)制整個數(shù)據(jù)結(jié)構(gòu),消耗內(nèi)存和 CPU。傳遞指針僅復(fù)制一個地址(64位系統(tǒng)占8字節(jié)),效率極高。

type BigData struct {
    Items int
}
// 使用指針接收,避免拷貝 10000 個 int
func process(data *BigData) {
    // 處理邏輯
}

5、注意事項

1. 不可取地址的情況

你不能對以下對象使用 & 取地址,否則編譯報錯 cannot take the address of ...

  • 字面量/常量‌:&42、&"hello" 是錯誤的。
  • Map 的值‌:&m["key"] 是錯誤的。因為 Map 的值可能隨時移動或不存在,Go 禁止直接取 Map 值的地址。如果需要,先將值賦給臨時變量再取址。
  • 函數(shù)返回值‌:通常情況下,不能直接對函數(shù)返回值取地址(除非返回的是指針或可尋址變量)。

2. 切片、Map 和 Channel 的特殊性

  • 切片(Slice)、Map 和 Channel 在 Go 中本身就是‌引用類型‌(底層實現(xiàn)包含指針)。
  • 無需傳指針‌:在函數(shù)間傳遞切片或 Map 時,通常直接傳遞值即可。函數(shù)內(nèi)部對元素內(nèi)容的修改會反映到原變量上。
  • 例外‌:如果你需要在函數(shù)內(nèi)改變切片的‌長度‌或‌容量‌(例如 append 導(dǎo)致底層數(shù)組重新分配),或者替換整個 Map 對象,則需要傳遞指向切片或 Map 的指針(如 *[]int),但這在日常開發(fā)中較少見。

3. 內(nèi)存逃逸與性能

  • 棧與堆‌:Go 編譯器會自動進行“逃逸分析”。如果局部變量的地址被返回或傳遞給其他 goroutine,該變量會分配到堆上,增加垃圾回收(GC)壓力。
  • 適度使用‌:不要濫用指針。對于小的基本類型(int, bool, small struct),值傳遞往往比指針傳遞更快,因為指針涉及間接尋址和可能的堆分配。

4. 原子指針與 unsafe

  • sync/atomic.Pointer 提供了無鎖的原子指針操作,適用于高并發(fā)場景下的狀態(tài)切換。
  • unsafe.Pointer 允許繞過類型系統(tǒng)進行指針轉(zhuǎn)換,極其危險,不參與 GC 生命周期檢查,容易導(dǎo)致懸垂指針或內(nèi)存破壞。除非編寫底層庫或驅(qū)動,否則嚴禁在業(yè)務(wù)代碼中使用。

到此這篇關(guān)于go語言指針常見操作方法的文章就介紹到這了,更多相關(guān)go語言指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析Go 字符串指紋

    淺析Go 字符串指紋

    這篇文章主要介紹了Go 字符串指紋的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)go語言,感興趣的朋友可以了解下
    2020-09-09
  • golang時間及時間戳的獲取轉(zhuǎn)換

    golang時間及時間戳的獲取轉(zhuǎn)換

    本文主要介紹了golang時間及時間戳的獲取轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Go語言常見哈希函數(shù)的使用

    Go語言常見哈希函數(shù)的使用

    哈希表(Hash table,也叫散列表),是根據(jù)關(guān)鍵碼值(Key value)而直接進行訪問的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通過把關(guān)鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。具體的介紹網(wǎng)上有很詳細的描述,如閑聊哈希表 ,這里就不再累述了;
    2015-03-03
  • Golang使用zlib壓縮和解壓縮字符串

    Golang使用zlib壓縮和解壓縮字符串

    本文給大家分享的是Golang使用zlib壓縮和解壓縮字符串的方法和示例,有需要的小伙伴可以參考下
    2017-02-02
  • go語言靜態(tài)庫的編譯和使用方法

    go語言靜態(tài)庫的編譯和使用方法

    這篇文章主要介紹了go語言靜態(tài)庫的編譯和使用方法,本文以windows平臺為例,通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • golang?用msgpack高效序列化的案例

    golang?用msgpack高效序列化的案例

    msgpack是一個非常受歡迎的Go序列化庫,具有很好的跨語言支持,這篇文章主要介紹了golang?用msgpack高效序列化的相關(guān)知識,需要的朋友可以參考下
    2023-05-05
  • Golang獲取目錄下的文件及目錄信息操作

    Golang獲取目錄下的文件及目錄信息操作

    這篇文章主要介紹了Golang獲取目錄下的文件及目錄信息操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go正則表達式匹配字符串,替換字符串方式

    Go正則表達式匹配字符串,替換字符串方式

    介紹了Go語言中使用正則表達式進行字符串匹配和替換的方法,包括匹配單個子字符串和所有子字符串,個人經(jīng)驗分享,旨在為讀者提供實用的編程技巧,并鼓勵大家支持腳本之家
    2025-02-02
  • golang中snappy的使用場合實例詳解

    golang中snappy的使用場合實例詳解

    在java 和go語言 大字符傳達的時候, 采用snappy 壓縮 解壓縮是最好的方案。下面這篇文章主要給大家介紹了關(guān)于golang中snappy使用場合的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12
  • golang批量執(zhí)行任務(wù)的通用模板分享

    golang批量執(zhí)行任務(wù)的通用模板分享

    這篇文章主要為大家詳細介紹了golang實現(xiàn)批量執(zhí)行任務(wù)的通用模板,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-11-11

最新評論

黄平县| 名山县| 鄄城县| 合江县| 广元市| 博兴县| 揭阳市| 梅河口市| 常熟市| 昭通市| 大庆市| 营山县| 巴马| 永济市| 茂名市| 乃东县| 卫辉市| 上犹县| 班戈县| 沧州市| 体育| 四川省| 五莲县| 翁牛特旗| 玛沁县| 邹平县| 三都| 都昌县| 普安县| 永德县| 图木舒克市| 新沂市| 石阡县| 全椒县| 太康县| 钟祥市| 昔阳县| 高邮市| 斗六市| 贵定县| 辽阳市|