【Golang】Go語言指針

Go語言指針

文章目錄

  • Go語言指針
    • 一、指針
    • 1.1、Go語言中的指針
      • 1.1.1、指針地址和指針類型
      • 1.1.2、指針取值
      • 1.1.3、空指針
      • 1.1.4、new和make
      • 1.1.5、new
      • 1.1.6、make
      • 1.1.7、new與make的區別

一、指針

  • 區別于C/C++中的指針,Go語言中的指針不能進行偏移和運算,是安全指針。
  • 要搞明白Go語言的指針需要先知道3個概念:指針地址、指針類型、指針取值。

1.1、Go語言中的指針

  • Go語言中的函數傳參都是值拷貝,當我們想要修改某個變量的時候,我們可以創建一個指向該變量地址的指針變量。傳遞數據使用指針,而無需拷貝數據。類型指針不能進行偏移和運算。Go語言中的指針操作非常簡單,只需要記住兩個符號: &(取地址)和*(根據地址取值)。

1.1.1、指針地址和指針類型

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

  • 取變量指針的語法如下:

ptr := &v	// v的類型為T
  • 其中:
v: 代表取地址的變量,類型為T
ptr: 用于接收地址的變量,ptr的類型就為*T,稱做T的指針類型。*代表指針
  • 舉個例子:
package mainimport "fmt"func main() {a := 10b := &afmt.Printf("a: %d ptr:%p\n", a, &a)  // a: 10 ptr:0xc00000a0d8fmt.Printf("b: %p type: %T\n", b, b)  // b: 0xc00000a0d8 type: *int// &b 其實就是變量afmt.Println(&b) // 0xc00006a050// 解引用這個指針b,打印的就是變量a的數據fmt.Println(*b) // 10}

1.1.2、指針取值

  • 在對普通變量使用&操作符號取地址后會獲得這個變量的指針,然后可以針對使用*操作,也就是指針取值,代碼如下。
func main() {a := 10b := &a // 取變量a的地址, 將指針保存到b中fmt.Printf("type of b: %T\n", b)c := *b // 指針取值 (根據指針去內存取值, 此時c的類型是一個正常的int類型)fmt.Printf("type of c: %T\n", c)fmt.Printf("value of c: %v\n", c)}
  • 輸出結果如下:
type of b: *int
type of c: int
value of c: 10
  • 總結:取地址操作符&和取值操作符*是一對互補操作符,&取出地址,*根據地址取出地址指向的值。

  • 變量、指針地址、指針變量、取地址、取值的相互關系和特性如下:

1.對變量進行取地址(&)操作,可以獲得這個變量的指針變量
2.指針變量的值是指針地址
3.對指針變量進行取值(*)操作,可以獲得指針變量指向的原變量的值
  • 指針傳值示例:
func modify1(x int) {x = 100
}func modify2(x *int) {*x = 100
}func main() {a := 10modify1(a)  fmt.Println(a)  // 10/*把 a 的內存地址傳遞給了指針 x, x就可以在函數內部修改 a 的值了*/modify2(&a)fmt.Println(a)  // 100
}

1.1.3、空指針

  • 當一個指針被定義后沒有分配到任何變量時,它的值為nil
  • 空指針的判斷
package mainimport "fmt"func main() {var p *stringfmt.Println(p) // 沒有賦值所以現在值為nilfmt.Printf("p的值是 %s/n", p)if p != nil {fmt.Println("非空\n")} else {fmt.Println("空值\n")}}

1.1.4、new和make

  • 先來看一個例子
func main() {var a *int*a = 100fmt.Println(*a)var b map[string]intb["測試"] = 100fmt.Println(b)
}
  • 執行上面的代碼會引發panic,為什么呢?在Go語言中對于引用類型的變量,我們在使用的時候不僅要聲明它,還要為它分配內存空間,是否我們的值就沒辦法存儲。而對于值類型的聲明不需要分配內存空間,是因為它們在聲明的時候已經默認分配好了內存空間。要分配內存,就引出來今天的newmake。Go語言中newmake是內建的兩個函數,主要用來分配內存

1.1.5、new

  • new是一個內置的函數,它的函數簽名如下:
func new(Type) *Type
  • 其中
1.Type表示類型, new函數只接受一個參數,這個參數是一個類型
2.*Type表示類型指針, new函數返回一個指向該類型內存地址的指針
  • new函數不太常用,使用new函數得到的是一個類型的指針,并且該指針對應的值為該類型的零值(可以這樣取理解,比如你的指針類型為int那么零值就是0,比如指針類型為bool那么零值就是false,這樣就在引用之指針的時候分配了內存地址,就不會報錯panic),舉個例子:
func main() {a := new(int)b := new(bool)fmt.Printf("%T\n", a) // *intfmt.Printf("%T\n", b) // *boolfmt.Println(*a) // 0fmt.Println(*b) // false
}
  • 本節開始的示例代碼中var a *int只是聲明了一個指針變量a但是沒有初始化,指針作為引用類型需要初始化后才能會擁有內存空間,才可以給它進行賦值。應該按照如下方式使用內置的new函數對a進行初始化之后就可以正常對其賦值了:
func main() {var a *inta = new(int)fmt.Println(*a)  // 0  因為int類型的默認值為 0 這就是零值
}

1.1.6、make

  • make也是用于內存分配的,區別于new,它只用于slice、map以及chan的內存創建,而且它返回的類型就是這三個類型本身,而不是他們的指針類型,因為這三種類型就是引用類型,所以就沒有必要返回他們的指針了。make函數的函數簽名如下:
func make(t Type, size ..integerType) Type
  • make函數是無可替代的,我們在使用slice、map以及channel的時候,都需要使用make進行初始化,然后才可以對它們進行操作。這個我們在剛剛也有提到。
  • 本節開始的示例中var b map[string]int只是聲明變量b是一個map類型的變量,需要像下面的示例代碼一樣使用make函數進行初始化操作之后,才能對其進行鍵值對賦值:
func main() {var b map[string]intb = make(map[string]int)b["測試"] = 100fmt.Println(b)
}

1.1.7、new與make的區別

1.二者都是用來做內存分配的
2.make只用于slice、map以及channel的初始化,返回的還是這三個引用類型本身
3.、而new用于類型的內存分配,并且內存對應的值為類型零值,返回的是指向類型的指針

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

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

相關文章

EMC的一些簡單常識

ESD測試比對 & 需要做到動作 試驗: -780系統,板子直流地 和 PE連接(主板PE & DC-分開,但是前端板PE & DC-連接),只能承受1K接觸放電。 -780系統,板子直流地 和 PE分開(主…

Day4||vue-計算屬性

一.定義概念:基于現有的數據,計算出來的新屬性。依賴的數據變化,自動重新計算。語法:聲明需要放在computed的配置項中,一個計算屬性對于一個函數。使用起來和普通屬性一樣使用{{計算屬性名}}計算屬性->可以將一段求…

編程算法在金融、醫療、教育、制造業等領域的落地案例

隨著人工智能與大數據技術的迅猛發展,編程算法已從理論研究走向實際應用,在金融、醫療、教育、制造業等多個關鍵領域實現了深度落地。這些算法不僅提升了業務效率,還推動了行業智能化轉型。本文將系統性地分析編程算法在四大核心領域的典型應…

vue npm install卡住沒反應

install某個插件的時候,發現卡住不動,可以嘗試以下解決方法 1.使用–verbose查看安裝詳情 npm install consola --verbose2.更換淘寶鏡像(一般都是淘寶鏡像正式過期問題) 查看當前鏡像 npm config get registry更換淘寶鏡像 第一種…

【Unity3D實例-功能-移動】角色移動-通過WSAD(CharacterController方式)

今天,我們就來聊聊如何在Unity中使用CharacterController組件,讓角色能夠靈活移動,在游戲世界里像風一樣自由奔跑吧。廢話不多說,走,讓我們馬上來一探究竟!目錄:1.準備模型2.動畫的處理3.為角色…

AI Agent開發學習系列 - langchain之LCEL(4):Memory

Memory的添加方式 from operator import itemgetterfrom langchain.memory import ConversationBufferMemory from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables import RunnableLambda, RunnablePassthrough from l…

向Coze學習,我們把這些工作流也開源了

要說現在最火的工作流是什么,那非視頻工作流莫屬了。我每天也都能接到不少咨詢短視頻工作流的需求。 這大半年來我們團隊也制作和整理了超過 100 工作流,其中很大一部分都是現在最火的視頻工作流。 為了向Coze開源致敬,這次我們斑碼團隊也決…

Git 從零開始:完整項目上傳指南

一、準備工作 1. 安裝 Git Windows:下載安裝包macOS:在終端運行 brew install gitLinux: # Ubuntu/Debian sudo apt update && sudo apt install git# CentOS/Fedora sudo yum install git2. 配置用戶信息(首次使用&am…

【AI】入門級提示詞模板:適用于ChatGPT、文心一言等主流模型

入門級提示詞模板:適用于 ChatGPT、文心一言等主流模型**在當下這個人工智能飛速發展的時代,ChatGPT、文心一言等主流大模型已經廣泛地融入到我們的工作與生活當中。不管是創作文章、生成代碼,還是進行數據分析、獲取創意靈感,這些…

如何解決 undetected_chromedriver 啟動慢問題

要解決 undetected_chromedriver 啟動慢的問題,可以從以下幾個方面優化配置和代碼: 1. 指定本地 Chrome 二進制路徑 避免自動搜索 Chrome 路徑,直接指定位置: driver uc.Chrome(browser_executable_pathrC:\Program Files\Google…

Python 程序設計講義(42):組合數據類型——元組類型:創建元組

Python 程序設計講義(42):組合數據類型——元組類型:創建元組 目錄Python 程序設計講義(42):組合數據類型——元組類型:創建元組一、元組的特征二、創建元組1、使用圓括號&#xff0…

windows 設置 vscode 免密遠程

我們可以使用 vscode ssh 進行遠程編輯文件項目。也可以使用 ssh 密匙 來實現免密登錄。 本人在本地windows系統有多個密匙,使用 D:\SPB_Data\.ssh\id_rsa_local 進行本地設備進行登錄。 在 vscode ssh 配置文件中添加 IdentityFile 配置 Host 本地設備ipHostName …

ubuntu自動搭建Android平臺NDK編譯環境

sh setup_ndk_env.sh自動下載NDK并解壓 提取Android平臺工具鏈 驗證Android工具鏈 設置工具鏈變量 export CROSS_TRIPLE=aarch64_linux_android export CROSS_ROOT=/home/ubuntu/${CROSS_TRIPLE} export ANDROID_NDK=${CROSS_ROOT} export AS=${CROSS_ROOT}/bin/llvm-as exp…

添加捕捉吸附標識(使用QT+OpenGL開發三維CAD)

捕捉吸附標識怎么畫出來?在點吸附的時候能夠展示吸附標識可以讓用戶更直觀的看到當前捕捉點,從而更準確的進行設計和繪制。 效果視頻見原文:添加捕捉吸附標識(使用QTOpenGL開發三維CAD) 16.Add snap label 鼠標捕捉吸…

元宇宙中的“蟲洞“:技術實現、應用場景與未來挑戰

一、技術定義與核心架構1.1 蟲洞的元宇宙隱喻概念來源:蟲洞在物理學中是連接不同時空的通道,而在元宇宙中,這一概念被引申為連接不同虛擬世界的跨平臺協議。英偉達Omniverse平臺通過USD(通用場景描述)實現了這一隱喻&a…

使用GIS中基于森林的分類與回歸模型來估算房屋價值

“基于森林的分類與回歸”,它可以幫助分析師有效地設計、測試和部署預測模型。 基于森林的分類與回歸應用了 Leo Breiman 的隨機森林算法,這是一種用于分類和預測的流行監督機器學習方法。該工具允許分析師輕松整合表格屬性、基于距離的要素和解釋柵格來…

《 java 隨想錄》| LeetCode鏈表高頻考題

前言:這是專門針對java語言講解的算法解析(題目順序大致參考《代碼隨想錄》)思維導圖操作鏈表刪除節點刪除鏈表中 D 節點時,只需將其前驅節點 C 的 next 指針指向 D 的下一個節點 E。添加節點?先讓 新節點 F 的 next 指針 指向 C…

學習嵌入式的第三十一天-數據結構-(2025.7.23)網絡協議封裝

今天的內容主要是網絡協議以及常用工具的介紹。協議頭與數據封包/拆包數據封包示例:MAC|IP|TCP|hello| ———————————— IP數據報IP頭信息默認20字節常用網絡測試工具telnetnetstatpingarpwiresharktcpdumpssh2secure crt工具安裝命令sudo ufw disable sud…

STL學習(十、常用排序、拷貝、替換算法)

目錄 一、常用排序算法 1.sort (1) 內置數據類型 (2)自定義數據類型 2. random_shuffle(iterator beg, iterator end) 3.merge 4.reverse 二、常用的拷貝和替換算法 1.copy(起始不如直接賦值) 2.replace 3.replace_if 4.swap 一、常用排序算法 1.sort 函數原型 s…

【Datawhale AI夏令營】科大訊飛AI大賽(大模型技術)/夏令營:讓AI理解列車排期表(Task3)

我沒招了jpgimport pandas as pd import requests import re import json from tqdm import tqdm from datetime import datetime, timedeltadef calculate_stop_duration(arrival_time_str, departure_time_str):"""計算列車停留時長,處理跨天和異常…