理解Go中的指針

引言

當你用Go編寫軟件時,你將編寫函數和方法。你可以將數據作為參數傳遞給這些函數。有時,函數需要數據的本地副本,而你希望原始數據保持不變。例如,如果你是一家銀行,你有一個函數向用戶顯示根據他們選擇的儲蓄計劃而產生的余額變化,你不希望在客戶選擇計劃之前更改他們的實際余額;你只是想在計算中使用它。這被稱為按值傳遞,因為你將變量的值發送給函數,而不是變量本身。

其他時候,你可能希望函數能夠改變原始變量中的數據。例如,當銀行客戶向他們的賬戶存款時,您希望存款功能能夠訪問實際余額,而不是副本。在這種情況下,你不需要將實際數據發送給函數;你只需要告訴函數數據在內存中的位置。一種稱為指針的數據類型保存的是數據的內存地址,而不是數據本身。內存地址告訴函數在哪里找到數據,而不是數據的值。你可以將指針而不是數據傳遞給函數,然后函數可以原地改變原始變量。這被稱為引用傳遞,因為變量的值并沒有傳遞給函數,只有它的位置。

在本文中,您將創建和使用指針來共享對變量內存空間的訪問。

定義和使用指針

當你使用指向變量的指針時,有幾個不同的語法元素需要你理解。第一個是和號(&)的使用。如果你在變量名前放一個&符號,你是在聲明你想要獲取地址,或者指向該變量的指針。第二個語法元素是使用星號(*)或解引用操作符。當你聲明一個指針變量時,在變量名后面加上指針所指向的變量的類型,并以*作為前綴,像這樣:

var myPointer *int32 = &someint

這將創建myPointer作為一個指向int32變量的指針,并將指針初始化為someint的地址。這個指針實際上并沒有包含int32,只是一個int32的地址。

讓我們看一下指向string的指針。下面的代碼聲明了一個字符串的值和一個指向字符串的指針:

main.go

package mainimport "fmt"func main() {var creature string = "shark"var pointer *string = &creaturefmt.Println("creature =", creature)fmt.Println("pointer =", pointer)
}

使用下面的命令運行這個程序:

go run main.go

運行這個程序時,它會打印出變量的值,以及變量的存儲地址(指針地址)。內存地址是十六進制數,并不是人類可讀的。在實踐中,您可能永遠不會輸出內存地址來查看它。我們展示給你們是為了說明。因為每個程序在運行時都是在自己的內存空間中創建的,所以每次運行時指針的值都不一樣,也和下面的輸出不一樣:

Outputcreature = shark
pointer = 0xc0000721e0

我們定義的第一個變量名為creature,并將它設置為一個值為sharkstring。然后我們創建了另一個名為pointer的變量。這次,我們將pointer變量的值設置為creature變量的地址。我們使用&符號(’ & ')將值的地址存儲在變量中。這意味著pointer變量存儲的是creature變量的地址,而不是實際值。

這就是為什么當我們打印pointer的值時,我們收到了0xc0000721e0的值,這是creature變量當前存儲在計算機內存中的地址。

如果你想打印出pointer變量指向的變量的值,你需要解引用該變量。下面的代碼使用*操作符解引pointer變量并獲取它的值:

main.go


package mainimport "fmt"func main() {var creature string = "shark"var pointer *string = &creaturefmt.Println("creature =", creature)fmt.Println("pointer =", pointer)fmt.Println("*pointer =", *pointer)
}
Outputcreature = shark
pointer = 0xc000010200
*pointer = shark

我們現在添加的最后一行解引了pointer變量,并打印出存儲在該地址的值。

如果你想修改存儲在pointer變量位置的值,你也可以使用解引用操作符:

main.go

package mainimport "fmt"func main() {var creature string = "shark"var pointer *string = &creaturefmt.Println("creature =", creature)fmt.Println("pointer =", pointer)fmt.Println("*pointer =", *pointer)*pointer = "jellyfish"fmt.

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

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

相關文章

OpenAI在中國,申請GPT-6、GPT-7商標

根據最新商標信息顯示,OpenAI已經在中國提交了GPT-6和GPT-7的商標注冊信息,分類是科學儀器和網站服務兩大類。申請日期是今年的11月2日,目前處于審核狀態。 該申請由知識產權代理公司完成,但申請人的地址正是OpenAI在美國公司的地…

Echarts圖表title使用富文本

rich中有配置的話(如a)使用該樣式,沒有配置樣式的話(如b)使用外層textstyle的樣式,textstyle沒有樣式的話使用默認樣式 const option1 {tooltip: {trigger: "item",},title: {text: ["{a|1…

Java代碼審計之SpEL表達式注入漏洞分析

文章目錄 前言SpEL表達式基礎基礎用法安全風險案例演示 CVE-2022-22963漏洞簡述環境搭建反彈shell CVE漏洞調試分析本地搭建調試分析補丁分析 總結 前言 表達式注入是 Java 安全中一類常見的能夠注入命令并形成 RCE 的漏洞,而常見的表達式注入方式有 EL 表達式注入…

124.(leaflet篇)leaflet禁止地圖移動,縮放,雙擊

地圖之家總目錄(訂閱之前必須詳細了解該博客) 完整代碼工程包下載,運行如有問題,可“私信”博主。效果如下所示: 下面獻上完整代碼,代碼重要位置會做相應解釋 <!DOCTYPE html> <html>

深入探索HTTPS加密技術與新興安全趨勢:保衛隱私的未來之路

在前文中&#xff0c;我們了解了HTTPS加密協議的工作原理和應用場景。然而&#xff0c;隨著技術的不斷發展和網絡安全威脅的不斷演變&#xff0c;HTTPS加密技術也在不斷進化。在本篇博文中&#xff0c;我們將更深入地探討HTTPS加密技術&#xff0c;并介紹一些新興的安全趨勢&am…

css中的 box-sizing: border-box

box-sizing: border-box 是 CSS 中的一個盒子模型屬性&#xff0c;用于指定元素的盒子模型的計算方式。默認的盒子模型是 content-box&#xff0c;而使用 border-box 則表示元素的寬度和高度包括了元素的邊框和內邊距&#xff0c;而不僅僅是內容的寬度和高度。 在默認的 conte…

【Docker】使用docker-compose搭建django+vue工程文章

我們嘗試使用docker-compose編排一個后端基于django,前端基于vue,數據庫為postgresql并使用nginx進行反向代理的web工程。 工程準備 Docker 安裝Docker 安裝docker-compose django 在python3.7的環境下創建 修改settings.py文件 修改 將靜態文件收集路徑添加進 ,筆…

pip指定優先從豆瓣源下載包

對于 Unix/macOS 系統&#xff0c;使用以下命令&#xff1a; pip config set global.index-url https://pypi.douban.com/simple/ 對于 Windows 系統&#xff0c;打開命令提示符或PowerShell&#xff0c;并使用相同的命令&#xff1a; pip config set global.index-url http…

react re-render的解決方案

問題代碼 import {Dispatch, FC, SetStateAction, useState} from reactimport ./App.cssconst Child: FC<{ m: number, setM: Dispatch<SetStateAction<number>> }> (props) > {const {m, setM } propsreturn (<div><button onClick{() &…

阿里java社招一面

1、項目所負責的功能介紹&#xff1b;B用戶對A用戶的用餐評價進行評論以及B用戶對評論進行追評的話怎么設計數據庫結構&#xff1b;菜品好評度排行榜怎么實現的 2、clickhouse為什么快 3、線程池有哪幾種&#xff0c;分別說說定義和優缺點&#xff1b;多線程使用過程中要注意…

XUbuntu22.04之8款免費UML工具(一百九十七)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 優質專欄&#xff1a;多媒…

前端知識筆記(四)———JQuery 自動刷新頁面但不閃爍的實現方法

在本文中&#xff0c;我們將介紹如何使用jQuery實現自動刷新頁面但不出現閃爍的效果。通常情況下&#xff0c;當我們需要自動刷新頁面時&#xff0c;使用簡單的location.reload()方法即可實現&#xff0c;但這會導致頁面在刷新時出現短暫的白屏或閃爍。為了解決這個問題&#x…

供應鏈管理痛點大解析!內附解決方案

供應鏈是指涉及產品或服務生產、運輸、分銷和最終交付給客戶的過程。 用一個汽車制造的例子來幫助大家理解&#xff1a; 原材料采購&#xff1a; 汽車制造商需要從供應商處采購制造汽車所需的原材料&#xff0c;例如金屬、橡膠、塑料和玻璃。生產制造&#xff1a;獲得原材料&…

UnoCSS 原子化開發初體驗

UnoCSS 是一個即時的原子化 CSS 引擎&#xff0c;旨在靈活和可擴展。核心是不拘一格的&#xff0c;所有的 CSS 工具類都是通過預設提供的。再也不用為了取一個 classname 類名而煩惱了。 一、UnoCSS 特點 完全可定制&#xff1a;無核心工具&#xff0c;所有功能都通過預設提供…

如何公網訪問內網的群暉NAS隨時隨地遠程訪問本地存儲的學習資源

文章目錄 前言本教程解決的問題是&#xff1a;按照本教程方法操作后&#xff0c;達到的效果是前排提醒&#xff1a; 1. 搭建群暉虛擬機1.1 下載黑群暉文件vmvare虛擬機安裝包1.2 安裝VMware虛擬機&#xff1a;1.3 解壓黑群暉虛擬機文件1.4 虛擬機初始化1.5 沒有搜索到黑群暉的解…

成都工業學院Web技術基礎(WEB)實驗六:ECMAScript基礎語法

寫在前面 1、基于2022級計算機大類實驗指導書 2、代碼僅提供參考&#xff0c;前端變化比較大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一樣 3、圖片和文字僅為示例&#xff0c;需要自行替換 4、如果代碼不滿足你的要求&#xff0c;請尋求其他的…

TwinCAT3 Modbus-TCP Client/Server使用

目錄 一、環境配置和準備 1、PLC中安裝TF6250-Modbus-TCP庫 2、勾選TF6250的license 3、PLC工程中添加Tc2_ModbusSrv庫文件 4、分別創建測試ModbusTCP測試的Server和Client程序 二、PLC作為Client端 1、設置測試電腦IP地址 2、運行MobusTCP測試工具 3、PLC端程序編寫 …

Hiera實戰:使用Hiera實現圖像分類任務(二)

文章目錄 訓練部分導入項目使用的庫設置隨機因子設置全局參數圖像預處理與增強讀取數據設置Loss設置模型設置優化器和學習率調整策略設置混合精度&#xff0c;DP多卡&#xff0c;EMA定義訓練和驗證函數訓練函數驗證函數調用訓練和驗證方法 運行以及結果查看測試完整的代碼 在上…

可學習超圖拉普拉斯算子代碼

python版本&#xff1a;3.6。sklearn版本&#xff1a;scikit-learn0.19 問題1&#xff1a;ERROR: Could not build wheels for ecos, scs, which is required to install pyproject.toml-based projects| 解決辦法&#xff1a;cvxpy安裝過程中遇到的坑_ecos 2.0.7.post1 cp37 …

大數據技術7:基于StarRocks統一OALP實時數倉

前言&#xff1a; 大家對StarRocks 的了解可能不及 ClickHouse或者是遠不及 ClickHouse 。但是大家可能聽說過 Doris &#xff0c;而 StarRocks 實際上原名叫做 Doris DB &#xff0c;他相當于是一個加強版的也就是一個 Doris ,也就是說 Doris 所有的功能 StarRocks 都是有的&a…