Go 語言-->指針

Go 語言–>指針

它允許你操作內存中的實際數據,而不僅僅是數據的副本。指針存儲的是另一個變量的內存地址,而不是變量的實際值。

1. 什么是指針

指針是存儲變量內存地址的變量,它指向另一個變量。通過指針,你可以間接地訪問和修改那個變量的值。

  • 指針變量:指針存儲一個內存地址,這個內存地址指向一個具體的值。
  • 解引用:通過指針訪問指向的變量的值。

2. 聲明指針

在 Go 中,指針通過在類型前加上 * 來聲明。例如,*int 表示一個指向 int 類型的指針。

示例:聲明指針

var ptr *int  // ptr 是一個指向 int 類型的指針

3. 獲取指針(取地址)

使用 & 操作符可以獲得一個變量的內存地址,這叫做取地址。

示例:獲取指針

package mainimport "fmt"func main() {var a int = 58var ptr *int = &a  // ptr 保存 a 的地址fmt.Println("a 的值:", a)       // 輸出:a 的值: 58fmt.Println("ptr 的值:", ptr)   // 輸出:ptr 的值: &afmt.Println("ptr 指向的值:", *ptr)  // 輸出:ptr 指向的值: 58
}
  • &a:返回變量 a 的內存地址。
  • *ptr:返回指針 ptr 所指向的變量的值。

4. 通過指針修改變量值

通過指針可以間接修改變量的值。通過解引用(*ptr)可以修改指針所指向的變量的值。

示例:通過指針修改值

package mainimport "fmt"func main() {var a int = 58var ptr *int = &a  // ptr 指向 a 的地址fmt.Println("修改前 a 的值:", a)  // 輸出:修改前 a 的值: 58*ptr = 100  // 通過指針修改 a 的值fmt.Println("修改后 a 的值:", a)  // 輸出:修改后 a 的值: 100
}

5. 指針與函數傳參

Go 中的函數傳參是按傳遞的,這意味著函數內部的參數是傳入值的副本。如果你想要在函數內修改參數的值,必須通過指針傳遞

示例:通過指針修改函數參數的值

package mainimport "fmt"func modifyValue(ptr *int) {*ptr = 500  // 修改 ptr 指向的變量的值
}func main() {a := 100fmt.Println("修改前 a 的值:", a)  // 輸出:修改前 a 的值: 100modifyValue(&a)  // 將 a 的地址傳遞給函數fmt.Println("修改后 a 的值:", a)  // 輸出:修改后 a 的值: 500
}

6. 零值指針

Go 中的指針默認值是 nil,即如果一個指針沒有指向任何地址,它的默認值是 nil。你可以檢查指針是否為 nil 來判斷它是否已經被初始化。

示例:零值指針

package mainimport "fmt"func main() {var ptr *int  // 默認為 nilfmt.Println("ptr 的值:", ptr)  // 輸出:ptr 的值: <nil>if ptr == nil {fmt.Println("指針是 nil")}
}

7. 指針和數組、切片

Go 中的數組和切片也可以通過指針來傳遞,指針可以用來操作數組或切片的數據。

示例:指針與數組

package mainimport "fmt"func modifyArray(arr *[3]int) {arr[0] = 100  // 通過指針修改數組
}func main() {arr := [3]int{1, 2, 3}fmt.Println("修改前數組:", arr)  // 輸出:修改前數組: [1 2 3]modifyArray(&arr)  // 將數組的地址傳遞給函數fmt.Println("修改后數組:", arr)  // 輸出:修改后數組: [100 2 3]
}

8. 指針與結構體

指針也可以指向結構體,結構體指針可以通過 -> 語法來訪問結構體的字段,或者通過 * 解引用來訪問結構體字段。

示例:指針與結構體

package mainimport "fmt"type Person struct {Name stringAge  int
}func modifyPerson(p *Person) {p.Name = "Alice"p.Age = 30
}func main() {person := Person{Name: "Bob", Age: 25}fmt.Println("修改前:", person)  // 輸出:修改前: {Bob 25}modifyPerson(&person)  // 將結構體的地址傳遞給函數fmt.Println("修改后:", person)  // 輸出:修改后: {Alice 30}
}

9. 指針的高級應用:指針的指針

Go 支持指針的指針,即你可以有一個指向指針的指針。這通常用于函數傳遞多個級別的地址或動態創建多級引用。

示例:指針的指針

package mainimport "fmt"func main() {var a int = 58var ptr *int = &avar ptr2 **int = &ptr  // ptr2 是指向 ptr 的指針fmt.Println("a 的值:", a)       // 輸出:a 的值: 58fmt.Println("ptr 的值:", *ptr)  // 輸出:ptr 的值: 58fmt.Println("ptr2 指向的值:", **ptr2) // 輸出:ptr2 指向的值: 58
}

10. 總結

  • 指針允許你通過內存地址間接訪問和修改變量的值。
  • 取地址操作符 (&) 用于獲取變量的內存地址。
  • 解引用操作符 (*) 用于訪問指針指向的變量的值。
  • Go 中的 指針默認值為 nil,檢查指針是否為 nil 是一個好的編程習慣。
  • Go 中的 指針可以與數組、切片、結構體 等一起使用,可以高效地傳遞大數據結構而無需復制數據。

指針在 Go 中的使用使得函數能直接修改外部變量,而不需要返回修改后的副本,這在處理大數據結構或需要高效內存管理時非常有用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93292.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟工八將:軟件開發全流程核心角色體系解析

軟工八將&#xff1a;軟件開發全流程核心角色體系解析 作者注&#xff1a;本概念是由大學生董翔提出&#xff0c;具有一些影響意義。 在現代軟件開發領域&#xff0c;團隊角色的專業化分工是產品成功的核心保障。“軟工八將”作為一套系統梳理軟件開發全流程核心角色的術語&…

安全風險監測系統是什么?內容有哪些?

安全風險監測系統是基于物聯網感知網絡與智能分析技術的綜合管理平臺&#xff0c;通過實時采集、分析和評估各類安全風險指標&#xff0c;構建起覆蓋識別、預警、處置全流程的主動防御體系。作為現代安全管理的中樞神經系統&#xff0c;該系統實現了從被動響應到主動預防的范式…

車載診斷架構 ---面向售后的DTC應該怎么樣填寫?

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

墨者:SQL注入漏洞測試(寬字節)

墨者學院&#xff1a;SQL注入漏洞測試(寬字節)&#x1f680; 1. 寬字節注入原理? 1.1. 與普通注入對比? 特性普通注入寬字節注入適用場景無轉義處理使用addslashes()等轉義函數核心原理直接閉合引號利用GBK等編碼吞掉轉義符\關鍵字符 " -- #%df %5c防御難度易防御需調…

(二)Eshop(RabbitMQ手動)

文章目錄項目地址一、Rabbit MQ1.1 Pulibsher1. IRabbitMQPublisher接口2. RabbitMQPublisher接口實現3. 使用1.2 Consumer1. 消費接口2. 實現消費者接口項目地址 教程作者&#xff1a;教程地址&#xff1a; 代碼倉庫地址&#xff1a; 所用到的框架和插件&#xff1a; dbt a…

WPF高級學習(一)

文章目錄一、理解進程和線程1. 進程&#xff1a;就像一個獨立的“工廠”舉例&#xff1a;2. 線程&#xff1a;就像工廠里的“工人”舉例&#xff1a;總結&#xff1a;進程 vs 線程二、線程一、WPF 中的線程類型二、核心規則&#xff1a;線程親和性&#xff08;Thread Affinity&…

JAVA知識點(四):SpringBoot與分布式、微服務架構

文章目錄SpringBoot 使用 Validation 進行參數校驗并統一返回校驗異常引入相應的依賴Validation的基本校驗注解添加參數校驗在DTO的屬性上添加校驗在controller對應的DTO添加Valid或者Validated對于復雜String校驗我們可以使用正則來校驗&#xff0c;如下所示&#xff1a;自定義…

GPU 服務器ecc報錯處理

1. 常見原因分析內存硬件問題&#xff1a;DIMM 內存模塊損壞或接觸不良&#xff08;最常見原因&#xff09;。內存插槽氧化、松動或物理損壞。內存與主板兼容性問題&#xff08;尤其是非原廠內存&#xff09;。環境因素&#xff1a;服務器內部溫度過高&#xff0c;導致內存穩定…

STM32入門之通用定時器PWM

一、通用定時器簡介STM32通用定時器由一個通過可編程預分頻器驅動的16位自動重裝載計數器組成&#xff0c;適用于多種應用場景&#xff0c;包括測量輸入信號的脈沖長度&#xff08;利用輸入捕獲功能&#xff09;和生成輸出波形&#xff08;使用輸出比較及PWM功能&#xff09;。…

第十八節 MATLAB for循環

MATLAB中 for 循環是一個重復的控制結構&#xff0c;可以有效地寫一個循環&#xff0c;只是執行的次數是特定的。MATLAB for 循環語法:MATLAB中的 for循環的語法如下&#xff1a;for index values<program statements>... endfor 循環的值有下述三種形式之一&#xff1a…

嵌入式硬件篇---zigbee無線串口通信問題解決方法

針對 ZigBee 無線串口通信中接收異常的問題&#xff0c;需結合其射頻特性、網絡機制、硬件配置等多維度原因&#xff0c;采取針對性解決措施。以下從具體場景出發&#xff0c;提供可落地的解決方法&#xff1a;一、解決射頻層干擾與信號衰減問題射頻層是無線通信的基礎&#xf…

移動高清盒子6PRO-河南創維E900V22D-晶晨S905L3B-4+16G-安卓9-線刷固件包

移動高清盒子6PRO-河南創維E900V22D-晶晨S905L3B-416G-安卓9-線刷固件包線刷方法&#xff1a;1、準備好一根雙公頭USB線刷刷機線&#xff0c;長度30-50CM長度最佳&#xff0c;同時準備一臺電腦&#xff1b;2、電腦上安裝好刷機工具Amlogic USB Burning Tool 軟件 →打開軟件 →…

臺式電腦有多個風扇開機只有部分轉動的原因

一、風扇未連接或連接松動這是最常見的原因之一&#xff0c;臺式機風扇通常需要通過線材與主板或電源連接&#xff1a;主板接口問題&#xff1a;CPU 風扇、機箱風扇等多連接到主板的風扇接口&#xff08;如 CPU_FAN、SYS_FAN&#xff09;&#xff0c;若線材未插緊、插錯接口&am…

【測試報告】思緒網(Java+Selenium+Jmeter自動化測試)

一、項目簡介思緒網作為一種在線交流平臺&#xff0c;支持用戶在平臺下發布文章&#xff0c;并進行討論。主要由登錄頁面&#xff0c;論壇頁面&#xff0c;帖子編輯頁&#xff0c;帖子詳情頁等頁面組成。二、項目功能1.登錄頁面&#xff1a;輸入正確的賬號密碼進行登錄,跳轉博客…

Nestjs框架: 基于Mongodb的多租戶功能集成和優化

概述 基于前文&#xff0c;我們知道如何集成多租戶的相關功能了, 現在我們繼續集成Monodb的多租戶形式需要注意的是&#xff0c;MongoDB 在 NestJS 中的使用過程中存在一些“坑點”如果按照默認方式集成&#xff0c;會發現連接數在不斷增長&#xff0c;即使我們請求的是相同的數…

如何利用機器學習分析篩選生物標記物

在生物信息學中&#xff0c;Lasso回歸、隨機森林&#xff08;Random Forest&#xff09;和XGBoost因其各自的特性和優勢&#xff0c;被廣泛應用于基因組學、蛋白質組學、藥物發現和疾病機制研究等領域。 Lasso回歸 癌癥亞型分類&#xff1a;從TCGA數據中篩選驅動基因&#xf…

計算機網絡(基礎篇)

TCP/IP 網絡模型 應用層&#xff08;Application Layer&#xff09; 應用層只需要專注于為用戶提供應用功能&#xff0c;比如 HTTP、FTP、Telnet、DNS、SMTP等。應用層是工作在操作系統中的用戶態&#xff0c;傳輸層及以下則工作在內核態。傳輸層&#xff08;Transport Layer&a…

全面解析 CSS Flex 布局:從入門到精通的所有屬性詳解

1. Flex 容器屬性 通過 display: flex 或 display: inline-flex 將元素設置為 Flex 容器。以下是所有容器屬性。 1.1 display: flex | inline-flex 作用&#xff1a;定義一個 Flex 容器。可選值&#xff1a; flex&#xff1a;塊級容器&#xff0c;占據整行。inline-flex&#x…

數據結構:對角矩陣(Diagonal Matrix)

目錄 矩陣的傳統表示&#xff1a;二維數組 &#x1f50d; 真正有用的數據是哪些&#xff1f; 從二維數組轉為一維數組 用 C 類實現對角矩陣 1. 對角矩陣真正需要存什么&#xff1f; 2. 對角矩陣允許哪些行為&#xff1f; 3. 為什么要動態分配數組&#xff1f; 接下來推…

Leetcode_349.兩個數組的交集

這道題的意思很明確&#xff0c;就是讓尋找兩個數組中的共同元素&#xff0c;并去重&#xff0c;由此可以聯想到哈希表的特性&#xff0c;注意到題目給的數據范圍&#xff0c;在1000以內&#xff0c;所以本題可以使用 STL 的庫函數&#xff0c;也可以使用數組進行模擬。 本題要…