GO—變量

Go語言是靜態類型語言,因此變量(variable)是有明確類型的,編譯器也會檢查變量類型的正確性。

我們從計算機系統的角度來講,變量就是一段或者多段內存,用于存儲數據

1.1 標準格式

var 變量名 變量類型

1

變量聲明以關鍵字var開頭,變量類型后置,行尾無須分號

舉個例子

//聲明了一個名為age的變量,類型為int
var age int

1
2

如果你學過C語言,就會體會到這樣聲明的好處,比如C語言這樣聲明:int* a, b ,那么只有a是指針,b不是,這樣會使人迷惑,如果想要兩個變量都為指針,需要這樣定義:int *a,*b。

在go語言中,我們使用這樣的聲明方式:var a,b *int,就可以輕松的將a,b都聲明為指針。

變量的命名規則遵循駝峰命名法,即首個單詞小寫,每個新單詞的首字母大寫,例如: startDate

1.2 基本類型

計算機中數據存儲的最小單位為bit(位),0或者1

byte:計算機中數據的基本單元,1字節=8bit,數據在計算機中存儲或者計算,至少為1個字節

  • bool
  • string
  • int(隨系統,一般是占用4個字節)、int8(占一個字節)、int16(占兩個字節)、int32(占4個字節)、int64(占8個字節)
  • uint(無符號整數)、uint8、uint16、uint32、uint64、uintptr
  • byte // uint8 的別名
  • rune // int32 的別名 代表一個 Unicode 碼
  • float32、float64
  • complex64、complex128

有符號和無符號的區別:int8 范圍 -128-127,uint8 范圍:0-255

當一個變量被聲明之后,系統自動賦予它該類型的零值:

int 為 0,float 為 0.0,bool 為 false,string 為空字符串,指針為 nil

所有的內存在 Go 中都是經過初始化的。

func main() {var age intage = 23fmt.Println(age)
}

1.3 不指明變量類型

//設置游戲中角色的初始等級為1
var level = 1;

1
2

像上面這種聲明變量的方式,并沒有指明類型,Go語言中,在編譯時會自動推導類型

我們可以使用

fmt.Printf("%T", level)

1

進行類型輸出。

func main() {//年齡為1 ,進行自動類型推斷var age = 1fmt.Printf("%T", age)}

1.4 批量格式

覺得每行都用 var 聲明變量比較煩瑣?Go語言提供了批量聲明的方式

func main() {// 批量類型聲明var (age    int     //年齡name   string  // 姓名length float32 //長度)age = 19name = "lct"length = 19.12fmt.Printf("age=%d,name=%s,length=%f", age, name, length)
}

1.5

我們可以省略var關鍵字,這樣寫起來更加便捷

//i是變量名 1 是值(或者表達式)
i := 1

1
2

上面講過,如果不指明類型,直接賦值,Go會自動推導類型

使用簡短格式有以下限制:

  1. 定義變量,同時顯式初始化
  2. 不能提供數據類型
  3. 只能用在函數內部
func main() {age := 10fmt.Printf("%T", age)
}

簡短變量聲明被廣泛用于大部分的局部變量的聲明和初始化,var 形式的聲明語句往往用于需要顯式指定變量類型的地方

2. 初始化變量

	//兩種初始化方式var length float32 = 13.23age := 10

以下的代碼會出錯:

package mainfunc main() {var level int = 1// 再次聲明并賦值 會報錯 no new variables on left side of := (左邊的變量已經被聲明了,不能重復聲明)level := 1
}

但是有特例

比如:net.Dial 提供按指定協議和地址發起網絡連接,這個函數有兩個返回值,一個是連接對象(conn),一個是錯誤對象(err)

正常的寫法:

package mainimport ("fmt""net"
)
func main() {var conn net.Connvar err errorconn, err = net.Dial("tcp", "127.0.0.1:8080")fmt.Println(conn)fmt.Println(err)
}

短變量的寫法:

func main() {conn, err := net.Dial("tcp", "127.0.0.1:8080")if err != nil {fmt.Println(err)}fmt.Println(conn)
}

在多個短變量聲明和賦值中,至少有一個新聲明的變量出現在左值中,即便其他變量名可能是重復聲明的,編譯器也不會報錯

3. 小demo

變量交換,比如a=100,b=200,交換之后 a=200,b=100

如果是你,你會怎么樣進行實現呢?

第一種

func main() {var a int = 100var b int = 200var temp inttemp = aa = bb = tempfmt.Println("a=", a, "b=", b)
}

第二種

func main() {var a int = 100var b int = 200//異或操作a = a ^ bb = a ^ ba = a ^ bfmt.Println("a=", a, "b=", b)
}

第三種

func main() {var a int = 100var b int = 200a, b = b, afmt.Println("a=", a, "b=", b)
}

  1. 匿名變量
    使用多重賦值時,如果不需要在左值中接受變量,可以使用匿名變量

比如上面的例子:

	//conn, err := net.Dial("tcp", "127.0.0.1:8080")//如果不想接受error的值,可以用 _ 來代替conn, _ := net.Dial("tcp", "127.0.0.1:8080")

匿名變量以“_”下劃線表示

匿名變量不占用命名空間,也不會分配內存。匿名變量可以重復聲明使用

“_”本身就是一個特殊的標識符,被稱為空白標識符。它可以像其他標識符那樣用于變量的聲明或賦值(任何類型都可以賦值給它),但任何賦給這個標識符的值都將被拋棄,因此這些值不能在后續的代碼中使用,也不可以使用這個標識符作為變量對其它變量進行賦值或運算。

5. 作用域

一個變量(常量、類型或函數)在程序中都有一定的作用范圍,稱之為作用域。

了解變量的作用域對我們學習Go語言來說是比較重要的,因為Go語言(靜態語言)會在編譯時檢查每個變量是否使用過,一旦出現未使用的變量,就會報編譯錯誤。

如果不能理解變量的作用域,就有可能會帶來一些不明所以的編譯錯誤。

根據變量定義位置的不同,可以分為以下三個類型:

  • 函數內定義的變量稱為局部變量
  • 函數外定義的變量稱為全局變量
  • 函數定義中的變量稱為形式參數

5.1 局部變量

在函數體內聲明的變量稱之為局部變量,它們的作用域只在函數體內,函數的參數和返回值變量都屬于局部變量。

局部變量不是一直存在的,它只在定義它的函數被調用后存在,函數調用結束后這個局部變量就會被銷毀。

package main
import ("fmt"
)
func main() {//聲明局部變量 a 和 b 并賦值var a int = 3var b int = 4//聲明局部變量 c 并計算 a 和 b 的和c := a + bfmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}

5.2 全局變量

在函數體外聲明的變量稱之為全局變量,全局變量只需要在一個源文件中定義,就可以在所有源文件中使用,當然,不包含這個全局變量的源文件需要使用“import”關鍵字引入全局變量所在的源文件之后才能使用這個全局變量。

全局變量聲明必須以 var 關鍵字開頭,如果想要在外部包中使用全局變量的首字母必須大寫。

package main
import "fmt"
//聲明全局變量
var c int
func main() {//聲明局部變量var a, b int//初始化參數a = 3b = 4c = a + bfmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}

Go語言程序中全局變量與局部變量名稱可以相同,但是函數體內的局部變量會被優先考慮。

var name string = "xiaoming"func main() {name := "xiaohong"fmt.Println(name) //xiaohong}

5.3 形式參數

在定義函數時函數名后面括號中的變量叫做形式參數(簡稱形參)。形式參數只在函數調用時才會生效,函數調用結束后就會被銷毀,在函數未被調用時,函數的形參并不占用實際的存儲單元,也沒有實際值。

形式參數會作為函數的局部變量來使用。

func main() {var a, b inta = 10b = 20fmt.Println("main 中的 a:", a, " b:", b)c := sum(a, b)fmt.Println("c:", c)
}func sum(a, b int) int {fmt.Println("sum中的a:", a, " b:", b)return a + b
}//main 中的 a: 10  b: 20
//sum中的a: 10  b: 20
//c: 30

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

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

相關文章

vue 使用vue-scroller 列表滑動到底部加載更多數據

安裝插件 npm install vue-scroller -dmain.js import VueScroller from vue-scroller Vue.use(VueScroller)<template><div class"wrap"><div class"footer"><div class"btn" click"open true">新增</d…

多層控制上身姿態的方法

1選擇要施加的clip并調出層控制窗口 2點選motion層控制 3選擇并復制pose&#xff08;注意在哪個層中選中的情況下復制的是那個層中的pose&#xff09; 4在新建層中分別選擇頭幀粘貼pose和尾幀粘貼pose因是上半身&#xff0c;因此mask中把下半身去掉即變灰

提升工作能力的方法

1.接受工作&#xff0c;只問標準 2.請示工作&#xff0c;必帶方案&#xff1b; 3.匯報工作&#xff0c;突出成果&#xff1b; 4.分享工作&#xff0c;細說流程&#xff1b; 5.復盤工作&#xff0c;總結SOP 如果能這么做&#xff0c;那將是一個非常通透的高手&#xff0c;所以高…

如何使用 takeUntil RxJS 操作符來聲明性地管理訂閱

簡介 Angular 處理取消訂閱可觀察對象的操作&#xff0c;比如從 HTTP 服務返回的可觀察對象或者使用 async 管道時。然而&#xff0c;對于其他情況&#xff0c;管理所有訂閱并確保取消長期存在的訂閱可能會變得困難。而且&#xff0c;取消大部分訂閱的策略也會帶來自己的問題。…

2024年春招小紅書前端實習面試題分享

文章目錄 導文面試重點一、方便介紹一下&#xff0c;你之前實習都做了什么嘛&#xff1f;二、 可以講一下封裝組件相關邏輯嘛&#xff1f;1. 為什么要封裝組件&#xff1f;2. 封裝組件的步驟3. 封裝組件的原則4. 組件的復用和擴展5. 組件的維護和文檔 三、項目的性能優化你有什…

python數據結構學習系列

在Python編程中&#xff0c;數據結構是組織、管理和存儲數據的方式&#xff0c;以便能夠有效地執行特定的操作。數據結構的選擇對于算法的效率、代碼的清晰度和可維護性都至關重要。以下是對Python中常見數據結構的學習總結。 列表&#xff08;List&#xff09; 列表是Python中…

selenium測試工具用來模擬用戶瀏覽器的操作

執行JS的類庫&#xff1a;execjs&#xff0c;PyV8&#xff0c;selenium&#xff0c;node pip list pip install selenium pip install xlrd pip install xlwt pip install PyExecJS pip install xlutils selenium測試工具可以用來模擬用戶瀏覽器的操作&#xff0c;其支持的瀏覽…

能當老板的AI大模型多智體框架MetaGPT自動完成項目

能當老板的AI大模型多智體框架MetaGPT自動完成項目。 MetaGPT是一個創新的多智能體框架&#xff0c;它結合了大語言模型&#xff08;LLM&#xff09;和多智能體協作系統&#xff0c;旨在通過模擬人類工作流程來解決復雜問題。這個框架的核心在于將標準化操作程序&#xff08;SO…

Redis學習路徑(構建體系)

學習路徑 掌握數據類型&#xff08;分析底層數據結構&#xff09;和緩存的基本使用 (理論使用) 掌握 redis 實現高性能&#xff0c;高可靠、高可用技術 &#xff08;理論&#xff09;學習redis源代碼底層實現 (底層實現) 先來一個引言&#xff0c;比較宏觀的角度&#xf…

Linux常用操作命令

Linux作為一種廣泛應用的操作系統&#xff0c;其強大的命令行工具使得用戶能夠高效地管理文件、處理數據和監控系統。在本文中&#xff0c;我們將深入 探討一些常用的Linux操作命令及其用法。 ls&#xff1a;列出當前目錄下的文件和子目錄。 ls [選項] [文件或目錄]常用選項&am…

Python實現MACD工具判斷信號:股票技術分析的工具系列(1)

Python實現MACD工具判斷信號&#xff1a;股票技術分析的工具系列&#xff08;1&#xff09; 介紹代碼rolling函數介紹核心代碼計算指數移動平均值計算MACD指標 完整代碼 介紹 先看看官方介紹&#xff1a; MACD (平滑異同平均線&#xff09; 指標說明 DIF線&#xff1a;收盤價短…

#單片機(TB6600驅動42步進電機)

1.IDE:keil 2.設備:保密 3.實驗&#xff1a;使用單片機通過普通IO口控制TB6600驅動42步進電機 4.時序圖&#xff1a; TB6600 ENA、ENA-DIR-、DIRPUL-、PULB-、BA、A-VCC、GND使能電機&#xff08;直接懸空不接&#xff09;方向脈沖輸入&#xff08;普通IO口模擬即可&#xff…

Linux系統編程7--線程 寫個測試腳本

Linux系統編程7–線程_寫個測試腳本 參考博客&#xff1a; Linux多線程編程初探 - 峰子_仰望陽光 - 博客園 (cnblogs.com) 我的PC是8核*16進程&#xff0c;所以在固定的時間點&#xff0c;我可以同時運行8 * 16的進程&#xff0c;更多的線程&#xff08;任務管理器&#xff09;…

【學習筆記】Diffusion擴散模型

導讀 Diffusion models是現在人工智能領域最火的方向之一&#xff0c;并引爆了AIGC領域&#xff0c;一大批創業公司隨之誕生。 AIGC&#xff08;AI-Generated Content&#xff09;&#xff1a;人工智能創作內容的生產方式。 擴散模型Diffusion 擴散模型Duffison的訓練過程 …

等概率事件算法

1等概率的生成(0-8)范圍內的正整數 // Math.random 數據范圍[0,1) 且 是 等概率的產生隨機數 // 應用&#xff1a; // 1.生成等概率的整數&#xff08;等概率的生成(0-8)范圍內的正整數 int value (int) (Math.random() * 9); System.out.println("value "…

非阻塞實現高效鍵盤掃描功能(STM32F4XX)

目錄 概述 1 原理分析 1.1 技術背景 1.2 系統硬件 1.3 STM32 IO&#xff08;輸入模式&#xff09;寄存器分析 1.3.1 輸入IO的功能描述 1.3.2 輸入配置 1.3.3 GPIO 寄存器&#xff08;輸入模式相關&#xff09; 1.3.3.1 GPIO 端口模式寄存器 1.3.3.2 GPIO 端口上拉/下拉…

springboot,druid動態數據源切換

關鍵字&#xff1a;springboot&#xff0c;druid數據庫連接池&#xff0c;兩個數據源&#xff08;可以切換成多個&#xff09;&#xff0c;事務管理 關于druid簡介傳送門&#xff1a;https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 具體分為四…

Doris【數據模型】

一、數據模型簡介 在 Doris 中&#xff0c;數據以表&#xff08;Table&#xff09;的形式進行邏輯上的描述。 一張表包括行&#xff08;Row&#xff09;和列&#xff08;Column&#xff09;。Row 即用戶的一行數據。Column 用于描述一行數據中不同的字段。 Column 可以分為兩…

autoware.universe中跟蹤模塊詳解,一看就懂!

目錄 問題:閱讀關鍵點:總結問題: 根據對預測模塊代碼的分析,發現預測框出現在點云前方的原因在于跟蹤框出現在點云前方 對rviz上的目標進行觀察后發現 車輛的檢測框先出來一段時間后,跟蹤框和預測框同步一塊出來 跟蹤框總是超出點云一部分 閱讀關鍵點: 每個跟蹤器最少要統計…

7.1.2 Selenium的用法1

目錄 1. 初始化瀏覽器對象和訪問頁面 2. 查找節點及節點交互 2.1 查找單個節點 &#xff08;1&#xff09;獲取方法1——特定方法 &#xff08;2&#xff09;通用方法 2.2 查找多個節點 2.3 節點交互 3. 動作鏈 4. 執行 JavaScript 之下拉進度條 5. 獲取節點信息 5.…