GO常量指針

Go語言中的常量使用關鍵字const定義,用于存儲不會改變的數據,常量是在編譯時被創建的,即使定義在函數內部也是如此,并且只能是布爾型、數字型(整數型、浮點型和復數)和字符串型。

由于編譯時的限制,定義常量的表達式必須為能被編譯器求值的常量表達式。

聲明格式:

type可以省略

和變量聲明一樣,可以批量聲明多個常量:

	const (e = 2.14pi=3.14)

所有常量的運算都可以在編譯期完成,這樣不僅可以減少運行時的工作,也方便其他代碼的編譯優化,當操作數是常量時,一些運行時的錯誤也可以在編譯時被發現,例如整數除零、字符串索引越界、任何導致無效浮點數的操作等。

常量間的所有算術運算、邏輯運算和比較運算的結果也是常量,對常量的類型轉換操作或以下函數調用都是返回常量結果:len、cap、real、imag、complex 和 unsafe.Sizeof。

因為它們的值是在編譯期就確定的,因此常量可以是構成類型的一部分

如果是批量聲明的常量,除了第一個外其它的常量右邊的初始化表達式都可以省略,如果省略初始化表達式則表示使用前面常量的初始化表達式,對應的常量類型也是一樣的。例如:

const (a = 1bc = 2d
)
fmt.Println(a, b, c, d) // "1 1 2 2"

1.1 iota 常量生成器

常量聲明可以使用 iota 常量生成器初始化,它用于生成一組以相似規則初始化的常量,但是不用每行都寫一遍初始化表達式。

在一個 const 聲明語句中,在第一個聲明的常量所在的行,iota 將會被置為 0,然后在每一個有常量聲明的行加1

比如,定義星期日到星期六,從0-6

2. 指針

指針(pointer)在Go語言中可以被拆分為兩個核心概念:

  • 類型指針,允許對這個指針類型的數據進行修改,傳遞數據可以直接使用指針,而無須拷貝數據,類型指針不能進行偏移和運算。
  • 切片,由指向起始元素的原始指針、元素數量和容量組成。

受益于這樣的約束和拆分,Go語言的指針類型變量即擁有指針高效訪問的特點,又不會發生指針偏移,從而避免了非法修改關鍵性數據的問題。

同時,垃圾回收也比較容易對不會發生偏移的指針進行檢索和回收。

切片比原始指針具備更強大的特性,而且更為安全。

切片在發生越界時,運行時會報出宕機,并打出堆棧,而原始指針只會崩潰。

2.1 如何理解指針

var a int = 10

如果用大白話來解釋上述語句:

在內存中開辟了一片空間,空間內存放著數值10,這片空間在整個內存當中,有一個唯一的地址,用來進行標識,指向這個地址的變量就稱為指針

如果用類比的說明:

內存比作酒店,每個房間就是一塊內存,上述代碼表示為:定了一間房間a,讓10住進了房間,房間有一個門牌號px,這個px就是房間的地址,房卡可以理解為就是指針,指向這個地址。

一個指針變量可以指向任何一個值的內存地址,它所指向的值的內存地址在 32 和 64 位機器上分別占用 4 或 8 個字節,占用字節的大小與所指向的值的大小無關。

當一個指針被定義后沒有分配到任何變量時,它的默認值為 nil。

每個變量在運行時都擁有一個地址,這個地址代表變量在內存中的位置。

Go語言中使用在變量名前面添加&操作符(前綴)來獲取變量的內存地址(取地址操作),格式如下:

//其中 v 代表被取地址的變量,變量 v 的地址使用變量 ptr 進行接收,ptr 的類型為*T,稱做 T 的指針類型,*代表指針。
ptr := &v    // v 的類型為 T

	var cat int = 1var str string = "hahah"fmt.Printf("%p %p", &cat, &str)  //0xc00000a0d8 0xc000020070

變量、指針和地址三者的關系是,每個變量都擁有地址,指針的值就是地址

當使用&操作符對普通變量進行取地址操作并得到變量的指針后,可以對指針使用*操作符,也就是指針取值

	var room int = 10ptr := &roomfmt.Println(ptr)        //0xc000096068fmt.Printf("%T\n", ptr) //*intfmt.Println(*ptr)  //10

取地址操作符&和取值操作符*是一對互補操作符,&取出地址,*根據地址取出地址指向的值

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

  • 對變量進行取地址操作使用&操作符,可以獲得這個變量的指針變量。
  • 指針變量的值是指針地址。
  • 對指針變量進行取值操作使用*操作符,可以獲得指針變量指向的原變量的值。

2.3 創建指針的另一種方法

Go語言還提供了另外一種方法來創建指針變量,格式如下:

new(類型)

str := new(string)
*str = "碼神之路Go語言教程"
fmt.Println(*str)

new() 函數可以創建一個對應類型的指針,創建過程會分配內存,被創建的指針指向默認值。

2.4 指針小案例

獲取命令行的輸入信息

Go語言內置的 flag 包實現了對命令行參數的解析,flag 包使得開發命令行工具更為簡單。

3. 變量的生命周期

變量的生命周期指的是在程序運行期間變量有效存在的時間間隔。

變量的生命周期與變量的作用域有不可分割的聯系:

  1. 全局變量:它的生命周期和整個程序的運行周期是一致的;
  2. 局部變量:它的生命周期則是動態的,從創建這個變量的聲明語句開始,到這個變量不再被引用為止;
  3. 形式參數和函數返回值:它們都屬于局部變量,在函數被調用的時候創建,函數調用結束后被銷毀。

go的內存中應用了兩種數據結構用于存放變量:

  1. 堆(heap):堆是用于存放進程執行中被動態分配的內存段。它的大小并不固定,可動態擴張或縮減。當進程調用 malloc 等函數分配內存時,新分配的內存就被動態加入到堆上(堆被擴張)。當利用 free 等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減);
  2. 棧(stack):棧又稱堆棧, 用來存放程序暫時創建的局部變量,也就是我們函數的大括號{ }中定義的局部變量。

棧是先進后出,往棧中放元素的過程,稱為入棧,取元素的過程稱為出棧。

棧可用于內存分配,棧的分配和回收速度非常快

在程序的編譯階段,編譯器會根據實際情況自動選擇在棧或者堆上分配局部變量的存儲空間,不論使用 var 還是 new 關鍵字聲明變量都不會影響編譯器的選擇。

func f() {x := 10global = &x
}func g() {y := new(int)*y = 1
}

上述代碼中,函數 f 里的變量 x 必須在堆上分配,因為它在函數退出后依然可以通過包一級的 global 變量找到,雖然它是在函數內部定義的。

用Go語言的術語說,這個局部變量 x 從函數 f 中逃逸了。

相反,當函數 g 返回時,變量 y 不再被使用,也就是說可以馬上被回收的。因此,y 并沒有從函數 g 中逃逸,編譯器可以選擇在棧上分配 *y 的存儲空間,也可以選擇在堆上分配,然后由Go語言的 GC(垃圾回收機制)回收這個變量的內存空間。

4. 類型別名

類型別名是 Go 1.9 版本添加的新功能,主要用于解決代碼升級、遷移中存在的類型兼容性問題。

格式:

//TypeAlias 只是 Type 的別名,本質上 TypeAlias 與 Type 是同一個類型,就像一個孩子小時候有小名、乳名,上學后用學名,英語老師又會給他起英文名,但這些名字都指的是他本人。
type TypeAlias = Type

還有一種是類型定義:

//定義Name為Type類型 ,定義之后 Name為一種新的類型
type Name Type

類型別名與類型定義表面上看只有一個等號的差異,那么它們之間實際的區別有哪些呢?

	//將newInt定義為int類型type newInt int//將int取一個別名叫intAlicetype intAlice = intvar a newIntfmt.Printf("%T\n", a) //main.newIntvar b intAlice   //IntAlias 類型只會在代碼中存在,編譯完成時,不會有 IntAlias 類型。fmt.Printf("%T\n", b) //int


8. 字符串與其他數據類型的轉換

整數 與 字符串

	var str1 string = "1"//字符串轉整型res, _ := strconv.Atoi(str1)fmt.Printf("%T\n", res)//整型轉字符串myString := strconv.Itoa(res)fmt.Printf("%T", myString)

浮點數 與字符串

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

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

相關文章

自動化測試系列 —— UI自動化測試!

UI 測試是一種測試類型,也稱為用戶界面測試,通過該測試,我們檢查應用程序的界面是否工作正常或是否存在任何妨礙用戶行為且不符合書面規格的 BUG。了解用戶將如何在用戶和網站之間進行交互以執行 UI 測試至關重要,通過執行 UI 測試…

Maven 插件之 maven-enforcer-plugin 解決沖突重復依賴

目錄 0、前言1、enforcer 是什么2、能干什么3、怎么用4、規則5、擴展規則6、使用7、banDuplicateClasses8、banDuplicatePomDependencyVersions 0、前言 maven 項目種經常出現 jar 包沖突、重復依賴、無效引用怎么辦,maven-enforcer-plugin 了解一下 1、enforcer …

《AI紀元:幻域探險》

游戲項目名稱:《AI紀元:幻域探險》 游戲類型:AI驅動的角色扮演探險游戲(RPG) 背景設定: 《AI紀元:幻域探險》設定在一個名為“幻域”的廣闊虛擬世界。這個世界由高度發達的AI技術支持&#xff0…

SpringCloud-同步異步通訊比較

本文詳細探討了同步通訊和異步通訊在信息傳遞中的區別,以及它們分別帶來的優勢和不足。通過對支付流程的案例分析,突顯了同步通訊可能面臨的阻塞和服務依賴問題,而異步通訊通過引入事件驅動模式和消息代理(Broker)成功…

SQL Server 開發環境配置教程(SSMS+SQL Prompt)

背景 記錄一下 SQL Server 常用開發軟件 體驗了各種數據庫IDE(DBeaver、Navicat、DataGrip)之后綜合下來還是感覺 SSMSSQL Prompt 對于 SQL Server 最好用,所以在此記錄一下配置過程 數據庫可視化管理工具SSMS 官方下載地址: https://learn.microsoft…

Java基礎數據結構之棧

一.什么是棧 棧是一種特殊的線性表,它只允許在固定的一端進行元素的添加與使用,且遵循先進后出的原則。添加取用元素的一端稱為棧頂,另一端稱為棧底。出棧和入棧都是操作棧頂元素 二.棧的模擬實現 棧的底層是一個數組 這是里面的成員變量以…

智能汽車加速車規級存儲應用DS2431P+TR 汽車級EEPROM 存儲器IC

DS2431PT&R是一款1024位1-Wire EEPROM芯片,由四頁存儲區組成,每頁256位。數據先被寫入一個8字節暫存器中,經校驗后復制到EEPROM存儲器。該器件的特點是,四頁存儲區相互獨立,可以單獨進行寫保護或進入EPROM仿真模式…

第2章 線性代數

目錄 1. 標量、向量、矩陣和張量2. 矩陣和向量相乘3. 單位矩陣和逆矩陣4. 線性相關和生成子空間5. 范數6. 特殊類型的矩陣和向量7. 特征分解8. 奇異值分解9. Moore-Penrose偽逆10. 跡運算11. 行列式 1. 標量、向量、矩陣和張量 標量(scalar):…

【 C++ 】特殊類設計

1、請設計一個類,不能被拷貝 拷貝只會出現在兩個場景中:拷貝構造函數以及賦值運算符重載,因此想要讓一個類禁止拷貝,只需讓該類不能調用拷貝構造函數以及賦值運算符重載即可。在C98和C11都有相對應的方法來解決此問題&#xff0c…

ssm172旅行社管理系統的設計與實現

** 🍅點贊收藏關注 → 私信領取本源代碼、數據庫🍅 本人在Java畢業設計領域有多年的經驗,陸續會更新更多優質的Java實戰項目希望你能有所收獲,少走一些彎路。🍅關注我不迷路🍅** 一 、設計說明 1.1 研究…

day03-Vue-Element

一、Ajax 1 Ajax 介紹 1.1 Ajax 概述 概念:Asynchronous JavaScript And XML,異步 的 JavaScript 和 XML。 作用: 數據交換:通過 Ajax 可以給服務器發送請求,并獲取服務器響應的數據。異步交互:可以在 不…

Java教程:SpringBoot項目如何對接Nacos實現服務發現治理,配置管理

–Nacos大家都知道,不懂的可以去官網或者網上查閱一下,本次給大家講解一下如何在SpringBoot項目中引入Nacos服務來進行服務治理與發現,配置管理等,在微服務當中是必不可少的,各個模塊之間可以通過Feign遠程調用&#x…

物聯網主機:為智能交通賦能

物聯網(IoT)技術的發展為智能交通領域帶來了許多創新的解決方案。而在物聯網應用中,物聯網主機起著關鍵的作用。本文將為大家介紹一款名為E6000的物聯網主機,它是一種多協議、多接口的物聯網主機,為智能交通系統的建設…

antvX6 - Vue自定義節點,并實現多種畫布操作,拖拽、縮放、連線、雙擊、檢索等等

一、 首先 antv x6 分為兩個版本 低版本和高版本 我這里是使用的2.0版本 并且搭配了相關插件 例如:畫布的圖形變換、地圖等 個人推薦 2.0版本,高版本配置多,可使用相關插件多,但是文檔描述小,仍在更新, 低…

小d和圖片壓縮

題目描述 小ddd和她對象小紅去海洋館玩了,但是由于小ddd拍照技術不好,他對象說把她拍的像嘎子! 小ddd看了看,發現是小紅最近長痘痘了,于是他為了討小紅開心,讓痘痘看不見,自學了圖像壓縮這個技…

裝飾器模式 詳解 設計模式

裝飾器模式 它允許你在不改變對象結構的情況下,動態地將新功能附加到對象上。 結構: 抽象組件(Component):定義了原始對象和裝飾器對象的公共接口或抽象類,可以是具體組件類的父類或接口。具體組件&…

固定排班計劃

目錄 1.按發車時間排序。 2.排班日期默認當天時間。 3.編輯不可修改線路和排班日期。 4.線路、車號、司機是否匹配,不匹配不可入庫(和其他表比),線路、發車時間、司機、車號、日期、上下行相同不可入庫(和自己表比…

GO語言學習筆記(與Java的比較學習)(一)

GO的優缺點: 此處引用華為云開發者聯盟的一篇文章: GO語言的亮點很明顯: GoDoc。 GoDoc的靜態語言分析能力很強大,可以直接從代碼和注釋生成漂亮的文檔。這一點區別于其他的類似工具如JavaDoc, PHPDoc或者JSDoc。這些工具需要添加…

如何在群暉Docker運行本地聊天機器人并結合內網穿透發布到公網訪問

文章目錄 1. 拉取相關的Docker鏡像2. 運行Ollama 鏡像3. 運行Chatbot Ollama鏡像4. 本地訪問5. 群暉安裝Cpolar6. 配置公網地址7. 公網訪問8. 固定公網地址 隨著ChatGPT 和open Sora 的熱度劇增,大語言模型時代,開啟了AI新篇章,大語言模型的應用非常廣泛,包括聊天機…

C# Socket通信從入門到精通(21)——TCP發送文件與接收文件 C#代碼實現

1、前言 我們在開發上位機軟件的過程中經常需要發送文件,本文就是介紹如何利用tcp客戶端發送文件、tcp服務器端接收文件,而且本文介紹的方法可以自動發送一個文件夾下的所有子目錄以及所有文件,經驗來自于實際項目,具備非常有價值的參考意義! 2、發送文件以及C#代碼 被發…