Golang 語言中的指針介紹

介紹:

? ? ? ? 指針式一種數據類型,用來存儲值的內存地址,為了便于理解,我們也可以把指針未內存地址,指針類型只占用內存4個或 8 個字節,在Golang 語言中,類型名稱加 *? 表示改類型的指針類型。

? ? ? ? 指針類型變量也需要一塊內存空間儲存值,指針變量的值就是它所指向數據的內存地址,而普通變量的值就是具體存放的數據,不同的指針類型變量之間無法互相賦值,在Golang 語言,指針不支持運算,也不能獲取常量的指針

指針定義:

? ? ? ? 在Golang 語言中,指針定義有3中方式:

? ? ? ? 第一種方式是使用取地符 & 獲取變量的指針(內存地址);

? ? ? ? 第二種方式的使用var 關鍵字聲明指針變量,使用var 關鍵字聲明的變量不能直接賦值和取值,因為它還沒有內存地址,它的值是nil;

? ? ? ? 第三種方式是使用內置的new 函數來聲明指針的變量,new 函數接收一個參數,可以傳遞類型給它,返回值是傳遞類型的指針類型。

實例代碼:

func main() {a := 1p := &afmt.Println("變量a 的值為:", a)fmt.Println("變量a 的內存地址為:", p)fmt.Printf("變量a 的類型為 %T\n:", a)fmt.Printf("變量a 的類型為 %T\n:", p)//var str string//var p1 *int////p1 = &str////p2 := new(int)//fmt.Printf("%v %T\n",p2,p2)
}

?輸出結果:

指針操作:

? ? ? ? 在Golang 語言中,指針操作包括取值和修改,取值就是獲取指針指向的值,只需在指針變量前加 * ;修改就是修改指針指向的值,需要注意的是使用 var 關鍵字聲明的指針變量不能直接賦值和取值,因為它還沒有它分配內存,它的值為nil ,可以使用內置函數 new 給它分配內存。

示例代碼:

import "fmt"func main() {b := 2p3 := &bval := *p3fmt.Println("變量 val 的值為 ",val)*p3  = 3fmt.Println("*p3 指針指向的值為: ", *p3)fmt.Println("變量 b 的值為: ",b)var p4 *int = new(int)*p4 = 4fmt.Println(*p4)
}

執行結果:

指針應用:

? ? ? ? 在Golang 語言中,函數傳遞參數只有值傳遞,傳遞的實參都是參數原始值的拷貝副本,所以我們傳遞類型的參數時,修改參數的值,原始數據不會被修改。但是,如果是指針類型的參數,修改參數的值,原始數據也會被修改,原因的指針類型的參數存儲的事內存地址,并且和實參的內存地址相同。

示例代碼:


func main() {mySalary := 80000fmt.Printf("變量 mySalary 的內存地址為: %p\n",&mySalary)modifySalary(mySalary)fmt.Println(mySalary)// 指針類型參數,實參的值被改變modifySalary2(&mySalary)fmt.Println(mySalary)}func modifySalary(salary int)  {fmt.Printf("參數變量的內存地址為: %p\n",&salary)salary = 100000
}func modifySalary2(salary *int)  {fmt.Printf("參數變量的內存地址為: %p\n",&salary)*salary = 100000
}

運行結果:

指針接收者:

? ? ? ? 在Golang 語言中,定義一個方法,接收者可以的值類型和指針類型,二者都可以調用方法,因為Golang 編譯器會自動轉換,所以二者是等價的

? ? ? ? 示例代碼:

import "fmt"type worker struct {name   stringsalary uint
}func (w *worker) raise() {w.salary += 1000
}func (w worker) raise1() {w.salary += 1000
}func main() {w := worker{name:   "frank",salary: 5000,}// 指針類型接收者w.raise()fmt.Printf("w 的姓名是 %s,薪水是每月 %d\n", w.name, w.salary)// 值類型調用者w1 := worker{name:   "frank1",salary: 5000,}fmt.Printf("w 的姓名是 %s,薪水是每月 %d\n", w1.name, w1.salary)w2 := worker{name: "luck",salary: 5000,}w2.raise()fmt.Printf("w 的姓名是 %s,薪水是每月 %d\n", w2.name, w2.salary)w3 := worker{name: "luck1",salary: 5000,}w3.raise()fmt.Printf("w 的姓名是 %s,薪水是每月 %d\n", w3.name, w3.salary)
}

運行結果:

如果需要修改接收者,可以使用指針修改指針向數據的值。

如果接收者是非 map 、slice 和 channel 類型,并且數據比較大,可以使用指針來節省內存。

總結:

? ? ? ? 本文我們介紹了Golang 語言中的指針,和指針定義與操作,并且介紹了指針為指針參數和指針接收者的應用區別。使用指針雖然可以修改數據的值和節省內存,但是也給開發帶來復雜性,所以為了開發簡單,在開發中處理必須使用指針類型外,盡量使用值類型,比如數據小的類型int? 、 bool 和需要并安全的代碼其實沒有必要使用指針。

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

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

相關文章

Flink 狀態管理設計詳解:StateBackend、State、RocksDB和Namespace

為什么需要 StateBackend?—— 職責分離原則我們可以用一個銀行的例子來類比:State (如 ValueState, ListState) 就像是你的銀行卡。AbstractKeyedStateBackend 就像是銀行的整個后臺系統(包括總服務器、數據庫、風控系統、會計系統等&#x…

櫥柜鉸鏈的革命:炬森精密如何以創新科技重塑家居體驗

在現代化家居設計中,櫥柜不僅是存儲空間的核心,更是生活品質的象征。而作為櫥柜的“關節”,櫥柜鉸鏈的性能直接影響著日常使用的便捷性、安全性和耐久性。然而,許多消費者在櫥柜使用中常遭遇噪音干擾、頻繁松動或早期損壞等痛點&a…

醫療系統國產化實錄:SQL Server國產替代,乙方保命指南

醫療行業的SQL Server替代,和普通業務系統完全不是一個量級——醫囑邏輯嵌套幾十層存儲過程、收費結算小數點錯位能引發醫患糾紛、電子病歷查詢慢一秒醫生直接拍桌子。作為被按在手術臺上的乙方PM,實測四款主流國產庫后,掏心窩子說句實話&…

WAIC 2025 盛大啟幕,深思考邀您解鎖端側 AI 新可能?!

2025 世界人工智能大會今日正式啟幕,深思考人工智能(iDeepWise)攜端側多模態大模型技術成果登陸展會,與行業伙伴共探端側 AI 發展新機遇。作為專注于類端側多模態大模型領域的創新力量,深思考此次重點展示了 iDeepWise…

MySQL相關概念和易錯知識點(2)(表結構的操作、數據類型、約束)

目錄1.表結構的操作(1)增加表(2)查看庫中所有的表(3)查看表每個列的約束(4)刪除整張表(5)刪除某個具體的列(6)增加某個具體的列&#…

1. Qt多線程開發

目錄方法1.繼承QThread使用案例總結方法2.將qobject對象moveToThread(官方推薦)使用案例總結方法3.QRunnable QThreadPool使用案例總結方法4.快速線程QtConcurrentQFutureWatcher使用案例總結代碼下載方法1.繼承QThread 需要實現QThread的抽象函數run …

ARM入門學習方法分享

首先認識什么是ARM?ARM公司簡介ARM是Advanced RISC Machines的縮寫,它是一家微處理器行業的知名企業,該企業設計了大量高性能、廉價、耗能低的RISC (精簡指令集)處理器。 1985年第一個ARM原型在英國劍橋誕生。公司的特點是只設計…

基于springboot的在線數碼商城/在線電子產品商品銷售系統的設計與實現

用戶:數碼產品,限時秒殺,種草分享,新品資訊,留言板,訂單管理,在線客服,購物車,個人中心管理員:個人中心,用戶管理,數碼分類管理&#…

Zookeeper學習專欄(十):核心流程剖析之服務啟動、請求處理與選舉協議

文章目錄前言一、服務端啟動流程1.1 啟動入口類:QuorumPeerMain1.2 集群模式啟動核心:runFromConfig1.3 QuorumPeer線程核心邏輯:run()1.4 關鍵子流程:數據恢復1.5 關鍵設計要點二、請求處理鏈(責任鏈模式)…

網絡基礎19--OSPF路由業務多區域

一、OSPF多區域必要性單區域問題:LSDB龐大 → 內存占用高,SPF計算開銷大LSA洪泛范圍廣 → 拓撲變化影響全域無法路由匯總 → 路由表膨脹,查找效率低2. 多區域優勢:1. 劃分區域:獨立LSDB,縮小數據庫規模2. 限…

MFC擴展庫BCGControlBar Pro v36.2新版亮點:圖形管理器等全新升級

BCGControlBar庫擁有500多個經過全面設計、測試和充分記錄的MFC擴展類。 我們的組件可以輕松地集成到您的應用程序中,并為您節省數百個開發和調試時間。 BCGControlBar專業版 v36.2已全新發布了,在這個版本中添加了一個新的擴展器控件、改進了網格和報表…

QT開發---網絡編程上

Qt Network 模塊Qt Network 模塊提供了豐富的類用于實現各種網絡通信功能,涵蓋 TCP、UDP、HTTP、FTP 等多種協議。 Qt 網絡類均為異步操作,通過信號槽處理結果,避免阻塞 UI 線程。在使用QT進行網絡編程之前,就必須在 CMakeLists.t…

[spring6: Mvc-函數式編程]-源碼解析

接口 ServerRequest public interface ServerRequest {HttpMethod method();URI uri();UriBuilder uriBuilder();default String path() {return requestPath().pathWithinApplication().value();}default RequestPath requestPath() {return ServletRequestPathUtils.getPar…

Linux DNS 服務器正反向解析

一、環境說明與準備工作 1.基礎信息 本次實驗用兩臺 Linux 主機,分別作為 DNS 服務端和客戶端,具體信息如下:服務端IP客戶端IP網址192.168.120.130192.168.120.128www.zy.com2.準備工作 關閉安全軟件:服務端和客戶端都要關閉防火墻…

歷史數據分析——中證旅游

中證旅游板塊走勢從月線級別來看2015年5月到2024年9月,月線上走出了一個震蕩中樞的月線級別下跌段;目前月線級別底部放巨量,總體還在底部震蕩,后續上漲的概率較大。從周線級別來看從2022年12月到2024年9月整體是下跌走勢&#xff…

OpHReda精準預測酶最佳PH

1.顯著改進:OpHReda通過檢索嵌入數據增強機制,顯著提高了酶最佳pH預測的準確性,相比現有方法提升了55%的F1分數。2.多尺度殘差輕注意力模塊:該模塊結合了殘差學習和多尺度特征提取,增強了模型對酶序列中殘差級信息的捕…

醫護行業在未來會被AI淘汰嗎?

隨著AI的迅速發展,似乎所有職業都有被AI替代的風險,那麼醫療領域作為一個高技術依賴性的行業,有機會被淘汰嗎?我們今天就來說說,幾乎不可能被AI淘汰的職業---護理。一) AI在護理中扮演的角色i.) 臨床工作支持1. 健康監測自動化即…

大語言模型加速技術之KV Cache

大語言模型加速技術之KV CacheWhy we need KV Cache ?Self-Attention Without CacheSelf-Attention With CacheHuggingface 官方代碼實現Why we need KV Cache ? 生成式generative模型的推理過程很有特點,我們給一個輸入文本,模型…

代碼隨想錄算法訓練營第五十三天|圖論part4

110.字符串接龍 題目鏈接&#xff1a;110. 字符串接龍文章講解&#xff1a;代碼隨想錄思路&#xff1a; 把每個字符串看成圖的一個節點。 轉換為求無權圖兩節點的的最短路徑。求最短路徑用bfs #include <string> #include <vector> #include <iostream> #i…

Java進階4:泛型、序列化和反序列化

Java泛型 Java泛型是JDK5引入的一個新的特性&#xff0c;泛型提供了編譯時的類型安全檢測機制&#xff0c;這個機制運行程序員在編譯的時候檢測到非法的類型。泛型的本質是參數化類型&#xff0c;也就是所操作的數據類型被指定為一個參數。 泛型方法 可以寫一個泛型方法&#x…