Go 語言中的變量和常量

這篇文章已經放到騰訊智能工作臺的知識庫啦,鏈接在這里:ima.copilot-Go 入門到入土。要是你有啥不懂的地方,就去知識庫找 AI 聊一聊吧。

1、變量的聲明與使用

我們來探討編程語言中最核心的概念之一:變量

1、靜態語言中的變量特性

Go 是一種靜態類型語言,其變量處理方式與 Python 等動態語言有顯著差異。對于沒有靜態語言背景的開發者來說,需要特別注意以下幾點:

  1. 必須先聲明后使用:任何變量都必須先經過聲明,才能在代碼中使用。

  2. 類型固定:在聲明變量時,其類型就已經確定。

  3. 類型不可變:一旦類型確定,就不能再賦予其他類型的值。例如,一個整型(int)變量不能被賦值為字符串(string)。

這種強類型約束使得編譯器能在編譯階段就發現許多潛在的錯誤,有助于編寫更健壯、更規范的大型項目。

2、變量的聲明方式

Go 語言提供了多種聲明變量的方式。

2.1 標準聲明 (var)

這是最基礎的聲明方式。使用 var 關鍵字,后跟變量名和類型。

image.png

注意:Go 的類型聲明位于變量名之后,這與其他靜態語言(如 C++ 或 Java)不同。建議直接適應這種語法,無需糾結其設計原因。

2.2 聲明并初始化

可以在聲明變量的同時為其賦予初始值。

image.png

當提供初始值時,Go 可以自動推斷類型,因此可以省略類型聲明:

image.png

2.3 短變量聲明 (:=)

這是 Go 中最常用、最簡潔的聲明方式,它會合并聲明和初始化兩個步驟。

image.png

這種方式只能用于局部變量(在函數內部聲明的變量),不能用于全局變量。在日常開發中,你會頻繁地使用這種方法。

3、全局變量與局部變量

3.1 全局變量

在函數體外聲明的變量,其作用域覆蓋整個包。

image.png

3.2 局部變量

在函數體內聲明的變量,其作用域僅限于該函數內部。

image.png

注意:短變量聲明 := 不能用于聲明全局變量。

4、多變量生成

Go 支持在一行內聲明多個變量。

image.png

5、變量使用的注意事項

  1. 變量名沖突:在同一作用域(代碼塊)內,不能重復聲明同名變量。但局部變量可以與全局變量同名,此時局部變量會“覆蓋”全局變量。

  2. 零值 (Zero Value):在 Go 中,變量在聲明后若未被顯式初始化,會被自動賦予其類型的零值。這避免了在其他語言中可能出現的“隨機值”問題。

  • int: 0

  • string: "" (空字符串)

  • bool: false

  • 指針、接口、切片、映射、通道:nil

image.png

  1. 聲明后必須使用:Go 語言強制要求,局部變量在聲明后必須被使用,否則會在編譯時報錯。此舉旨在鼓勵編寫整潔、無冗余的代碼。全局變量則無此限制。

image.png

2、常量的定義和使用

在 Go 語言中,常量(Constant)是指在程序編譯時就已確定,并且在運行時不能被修改的固定值。當程序中有些值從始至終都不應改變時,將其定義為常量是最佳實踐。這可以有效防止在代碼的某個地方無意中修改了重要的值。

1、常量的基本定義

常量的定義與變量類似,但使用 const 關鍵字。

image.png

核心特性:

  • 不可變性:常量一旦聲明,其值就不能再被修改。任何嘗試對常量重新賦值的行為都會導致編譯錯誤。

image.png

2、常量的類型

常量也具有類型。Go 語言支持在定義常量時顯式指定類型,也支持通過值進行隱式類型推斷。

2.1 顯式定義

明確指定常量的類型。

image.png

2.2 隱式定義

不指定類型,由編譯器根據所賦的值自動推斷。

image.png

在這種情況下,編譯器會自動推斷 E 的類型。

3、命名規范

為了在代碼中清晰地區分常量和變量,Go 語言的開發社區遵循以下命名規范:

  • 常量名全部大寫

  • 如果常量名由多個單詞組成,使用下劃線 _ 分隔

image.png

雖然這并非強制性語法,但遵循此規范可以極大地提高代碼的可讀性

4、分組定義常量

為了代碼的整潔和可讀性,當需要定義多個相關的常量時,可以使用括號 () 將它們分組。

image.png

分組定義時,存在一個重要的特性:在一組常量中,如果某個常量沒有被顯式賦值,它會自動沿用上一個常量的值和類型。

看下面的例子:

image.png

當我們打印這些常量時,會得到 16, 16, "abc", "abc", "abc"

對這個特性的理解,是掌握 Go 中另一個重要關鍵字 iota 的基礎,我們將在后續文章中詳細講解。

5、常量定義的核心規則總結

  1. 支持的類型:常量只能是布爾類型、數值類型(整數、浮點數、復數)和字符串類型。其他更復雜的類型(如 structarray)不支持定義為常量。

  2. 無需強制使用:與變量不同,如果定義了一個常量但從未使用它,編譯器不會報錯。

  3. 類型一致性:如果顯式指定了常量的類型,那么賦予它的值必須與該類型兼容。

3、Go 語言中的 iota 詳解

iota 是 Go 語言中一個非常有用的關鍵字,專用于常量的定義。它可以被看作一個可由編譯器在編譯期間修改的特殊常量。iota 的主要作用是簡化具有遞增規律的常量的定義,尤其在定義枚舉值、錯誤碼等場景中,能顯著提高代碼的可讀性和可維護性。

1、iota 的基本用法

iota 的值由編譯器控制,它從 0 開始,在同一個 const 定義組中,每增加一個常量聲明,其值就會自動加 1。

image.png

2、iota 的隱式特性與簡化寫法

Go 語言的 const 聲明有一個特性:如果某一行沒有指定值,它會自動沿用上一行的表達式。這個特性與 iota 結合使用,可以寫出非常簡潔的代碼。

你只需要在第一個常量上使用 iota,后續的常量會自動應用遞增的

image.png

這種寫法是 iota 最常用、最推薦的實踐。如果后續需要在中間插入新的常量,無需手動修改后續所有常量的值,iota 會自動處理。

3、使用表達式自定義 iota 序列

iota 的強大之處在于它可以參與運算。你可以用它來構建更復雜的常量序列。

例如,讓序列從 1 開始:

image.png

4、中斷和恢復 iota

如果在 const 組中,你手動為某個常量賦值,那么 iota 的遞增在這一行會被中斷。但是,iota 的內部計數器仍然會根據行數繼續增加。

當你再次使用 iota 時,它會返回當前行對應的計數值,而不是被中斷行的值。

image.png

關鍵點iota 的值取決于它所在的行號(從 0 開始),而不是上一行的常量值。

5、iota 的核心規則總結

  1. const 塊重置iota 的計數器在每一個新的 const 關鍵字出現時都會被重置為 0。

image.png

  1. 行數遞增:在 const 塊中,每新增一行常量聲明(即使該行是空標識符),iota 的計數器就會自動加 1。

  2. 表達式沿用:如果常量定義被省略,它會自動沿用上一行的賦值表達式。

  3. 中斷不影響計數:即使某一行不使用 iota,其內部計數器依然會增加。當后續行恢復使用 iota 時,將獲取該行對應的計數值。

iota 是 Go 語言中一個精妙的設計,掌握它能讓你的代碼更加簡潔和優雅。

4、匿名變量

在 Go 語言中,有一個非常嚴格的規則:所有聲明的變量都必須被使用,否則編譯器會報錯。然而,在某些場景下,我們可能需要接收一個值,但又確實不需要使用它。為了解決這個問題,Go 提供了匿名變量(Anonymous Variable)

匿名變量使用一個下劃線 _ 來表示,它是一個特殊的變量名,可以看作一個“占位符”。任何賦予匿名變量的值都會被直接丟棄,因此它不需要被使用,也不會引發編譯錯誤。

1、匿名變量的核心用途

匿名變量最常見的用途是處理函數的多個返回值

在 Go 中,一個函數可以返回多個值。當調用這樣的函數時,你必須用相應數量的變量來接收所有返回值。但有時,你可能只關心其中的一部分返回值。

場景示例:

假設我們有一個函數 getData(),它返回一個整數和一個布爾值。

image.png

現在,我們只想判斷操作是否成功(即只關心返回的布爾值),而對那個整數不感興趣。

錯誤的做法:

image.png

正確的做法:使用匿名變量

我們可以使用匿名變量 _ 來接收那個我們不關心的整數值。

image.png

通過這種方式,我們既滿足了函數多返回值的接收要求,又避免了因變量未使用而導致的編譯錯誤。

總結

  • 定義:匿名變量是一個下劃線 _

  • 作用:作為值的占位符,接收并丟棄你不需要的值,以滿足語法要求。

  • 優勢:使代碼更簡潔,可以優雅地忽略不必要的函數返回值或其他值。

在后續學習 Go 的接口(Interface)等更高級的概念時,你還會遇到匿名變量的其他應用場景。掌握它是編寫地道 Go 代碼的重要一步。

5、變量作用域

在像 Go 這樣的靜態類型語言中,作用域(Scope) 是一個至關重要的概念。它定義了程序中一個變量可以被訪問的區域。與許多動態語言相比,Go 對作用域的規定非常嚴格,這有助于在編譯階段就發現潛在的錯誤,從而提高代碼的健壯性。

1、全局作用域 (Global Scope)

在所有函數體外部聲明的變量,擁有全局作用域。這意味著它們可以在當前包(package)的任何地方被訪問和修改。

image.png

2、局部作用域 (Local Scope)

image.png

3、塊級作用域 (Block Scope)

Go 語言的作用域規則是基于 代碼塊的,代碼塊由花括號 {} 界定。在 ifforswitch 或普通 {} 內部聲明的變量,其作用域僅限于該代碼塊。

這是靜態語言中一個非常重要的特性:一旦程序執行離開一個代碼塊,該塊內聲明的所有變量都將被銷毀,無法在外部訪問。

示例 1:普通代碼塊

image.png

示例 2:if 條件塊

image.png

一個常見的誤區是,認為如果在 ifelse 的所有分支中都定義了同名變量,那么在外部就可以訪問它。這是錯誤的,因為每個變量的作用域都被限制在各自的代碼塊內。

image.png

4、總結

  • 全局變量:在整個包內可見。

  • 局部變量:僅在聲明它的函數或代碼塊 {} 內部可見。

  • 嚴格性:Go 語言嚴格遵循基于代碼塊的作用域規則。離開一個代碼塊,內部變量即失效。

  • 好處:這種嚴格性可以有效防止變量被意外訪問或修改,減少了程序出錯的可能性,是靜態語言可靠性的重要保障。IDE 和編譯器也能基于此規則提供準確的錯誤提示。

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

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

相關文章

破局傳統訂貨!云徙渠道訂貨系統賦能企業數字化渠道升級

在數字化浪潮的推動下,傳統經銷商訂貨模式面臨著諸多挑戰,如信息孤島、系統崩潰、移動化不足等問題。云徙渠道訂貨系統憑借其創新的數字化架構和強大的功能模塊,正在成為企業實現渠道數字化轉型的重要工具。 系統功能與創新 云徙渠道訂貨系統…

SQL關鍵字三分鐘入門:UNION 與 UNION ALL —— 數據合并全攻略

在處理數據時,有時我們需要將來自不同表或同一表的不同查詢結果合并在一起。例如: 合并兩個部門的員工名單;將多個地區的銷售數據匯總;顯示某段時間內所有新增和修改的記錄。 這時候,我們就需要用到 SQL 中非常強大的…

SNMPv3 的安全命名空間詳解

1. 安全命名空間的本質 安全命名空間是 SNMPv3 的核心安全機制,通過 上下文(Context) 實現: #mermaid-svg-6cV9146nTFF1zCMJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merma…

【嵌入式硬件實例】-555定時器實現煙霧和易燃氣體泄露檢測

555定時器實現煙霧和易燃氣體泄露檢測 文章目錄 555定時器實現煙霧和易燃氣體泄露檢測1、555定時器介紹2、MQ-2 氣體/煙霧傳感器模塊介紹3、硬件準備與接線在本文中,我們將使用555定時器和MQ-2氣體傳感器構建一個氣體泄漏檢測和報警系統。它在煤氣泄漏期間用作家庭安全警報器。…

【機器人】DualMap 具身導航 | 動態場景 開放詞匯語義建圖 導航系統

DualMap 是一個在線的開放詞匯語義映射系統,使得機器人能夠通過自然語言查詢在動態變化的環境中理解和導航 雙地圖導航,結合全局抽象地圖進行高層次候選選擇,以及局部具體地圖進行精確目標定位,有效管理和更新環境中的動態變化。…

【Fifty Project - D37】

fifty project算是失敗了一半了 成功的那一半在于一定程度上拯救了我的作息和健康,兩個月前入職體檢的肝有點不健康,昨天復查發現全都回到了健康范圍!尿酸也在正常范圍!就是體重還是沒減下來hhh 失敗的一半在于自己很差勁的規劃能…

解碼危險品物流背后的“隱形防線”

當急救藥品跨越千里送達醫院,當新能源電池準時抵達生產線,當化工原料安全運往工廠……這些與日常生活息息相關的場景背后,有一群人始終在和時間賽跑,與風險博弈。他們不是超級英雄,而是危險品物流從業者——一個鮮少被…

Flutter Melos在外包團隊協作中的弊端與應對策略

引言 在大型Flutter項目開發中,Melos作為一款優秀的Monorepo管理工具,能夠有效協調多包項目的開發流程。然而,當項目涉及外包團隊協作時,Melos的使用會面臨一系列獨特的挑戰。本文將深入分析Flutter Melos在外包團隊協作環境中的…

<selectKey> 中的order 屬性

在 MyBatis 中&#xff0c;<selectKey> 標簽的 order 屬性用于指定生成主鍵值的 SQL 語句執行時機。 除了 AFTER&#xff0c;MyBatis 還支持另一種模式&#xff1a;BEFORE&#xff0c; 它們有明確的使用場景和區別&#xff1a; order"AFTER" 適用數據庫&#x…

BitsAndBytes(簡稱 BnB)是一個用于“壓縮”大語言模型的工具包

BitsAndBytes&#xff08;簡稱 BnB&#xff09;是一個用于“壓縮”大語言模型的工具包&#xff0c;能把模型從原來的16位或32位&#xff0c;壓成4位或8位&#xff0c;減少顯存占用&#xff0c;同時保持盡量高的精度。 &#x1f9e9; 為什么叫 Bits and Bytes&#xff1f; 它的…

【前端】 Vue 3 中二次封裝組件

在 Vue 3 中二次封裝組件是提高代碼復用性和維護性的重要手段。以下是詳細的封裝方法和最佳實踐&#xff1a; 一、封裝原則 功能擴展&#xff1a;在原有組件基礎上添加新功能定制樣式&#xff1a;統一項目的 UI 設計規范簡化接口&#xff1a;隱藏復雜邏輯&#xff0c;提供簡潔…

分布式詞表示(Distributed Word Representation):自然語言處理的核心基石

分布式詞表示&#xff08;Distributed Word Representation&#xff09;&#xff1a;自然語言處理的核心基石 在自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;如何將離散的詞匯轉化為計算機可理解的數值形式&#xff0c;一直是技術突破的關鍵。傳統的獨熱編碼&…

Windows Playwright NotImplementedError問題深究

原文鏈接&#xff1a;Windows Playwright NotImplementedError問題深究 < Ping通途說 0. 引言 今天來看一下這個困擾我很久的問題。是關于在FastAPI / NiceGUI 等基于Uvicorn環境下使用Async Playwright 提示NotImplementedError的問題。 本解決方案僅適用基于Uvicorn的異步…

QCustomPlot 數據可視化方式詳解

QCustomPlot 數據可視化方式詳解 QCustomPlot 提供了多種靈活的數據顯示方式,可以滿足從簡單靜態圖表到復雜實時數據可視化的各種需求。以下是 QCustomPlot 顯示數據的核心方式和策略: 基本數據顯示方式 1.1 完整數據設置 (setData)// 一次性設置完整數據集 QVector<doub…

家用舊電腦搭建小型服務器操作步驟教程:一步一步本地部署到公網訪問

你家是不是也有一臺吃灰的舊電腦&#xff1f;別急著扔&#xff0c;它其實還能發揮大作用&#xff01;小編最近就把家里一臺十年前的老臺式機&#xff0c;改造成了一個小型服務器&#xff0c;主要用來文件備份、當網站測試環境&#xff0c;還是比較有用的。今天就來手把手教你&a…

Python銀行賬戶系統全解析

完整代碼如下&#xff1a; class BankAccount:def __init__(self, account_holder, initial_balance0):"""初始化銀行賬戶:param account_holder: 賬戶持有人姓名:param initial_balance: 初始余額&#xff0c;默認為0"""self.account_holder …

博世X阿里云:智能座艙接入通義大模型!

近日,全球領先的汽車技術與服務商博世與阿里云宣布在大模型領域達成合作,通義大模型助力博世加速AI技術應用于智能座艙,首次實現座艙環境主動感知和3D數字人交互。 博世AI智能座艙技術原型由博世智能駕控事業部以通義千問和通義萬相為基礎,結合阿里云百煉大模型服務平臺和磐曦數…

高性能計算服務器的主要作用都有哪些?

高性能計算服務器是一種專門為了處理大規模科學計算和數據分析任務所設計的服務器&#xff0c;高性能計算服務器擁有著強大的計算能力和高速的數據傳輸能力&#xff0c;有著高度的可靠性和可擴展性&#xff0c;下面小編就來介紹一下高性能計算服務器的主要作用吧&#xff01; 高…

C++ 進階:深入理解虛函數、繼承與多態

前言 在 C 的面向對象編程中&#xff0c;繼承和多態是兩個核心概念。今天我們將深入探討 C 中與多態密切相關的幾個重要特性&#xff1a;虛函數、virtual 關鍵字、override 關鍵字、多重繼承以及虛繼承。這些內容是理解 C 多態機制和復雜類層次結構的關鍵。 虛函數與 virtual…

為AR眼鏡等多種智能可穿戴設備添加穿戴狀態檢測功能

作者&#xff1a;Azoteq中國 隨著AR/VR眼鏡、頭戴式耳機和入耳式耳塞、智能手表和健身手環等可穿戴電子產品受到越來越多消費者的歡迎&#xff0c;如何設計外形更加時尚迷人、功能更加先進宜人的穿戴產品成為了創新和創意的焦點。作為全球領先的多傳感器解決方案提供商&#xf…