您好,登錄后才能下訂單哦!
這篇文章主要介紹“Go語言的變量與常量怎么定義”,在日常操作中,相信很多人在Go語言的變量與常量怎么定義問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Go語言的變量與常量怎么定義”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
簡單闡述一下什么是變量交換,顧名思義,就是將變量的值進行交換的一個動作
例如我們定義了兩個變量a:=10
和b:=20
,那么這時候我們想要將兩個變量的值進行交換的話,在Go語言中為我們提供了比較方便的方式。
案例
package main import "fmt" func main() { // 定義變量a、b,并且分別賦值10、20 a, b := 10, 20 // 第一輪輸出查看結果 fmt.Println("原本a、b的結果為:", a, b) // 然后我們可以直接用 = 號來對a、b進行快速賦值,交換他們的位置 a, b = b, a // 第二輪輸出查看結果 fmt.Println("新輸出的a、b結果為:", a, b) }
通過以上代碼我們可以看到,在=
的右側寓意為賦值,因為在Go中支持多賦值和多聲明的代碼形式,所以我們只需要將要賦值的變量進行位置對換,那么新的值就被賦予了。
闡述完變量交換,那么我們就不得不提變量中的一個特殊存在,那就是匿名變量
將值賦予給匿名變量實際上也就等于將這個值給拋棄了。通常也稱之為拋棄值
關鍵標識
利用 _ 下劃線,來標識匿名變量,也是我們所說的空白標識符
案例
package main import "fmt" func main() { // 定義變量 _, a := 10, 7 // 使用匿名變量的時候10就是拋棄值 fmt.Println("輸出結果:", a) }
可能很多人會有疑問這個匿名變量有什么意義,其實在實際的使用場景中,匿名變量的使用意義個人感覺更趨近于占位符。
假設我們用到了某個函數名字叫Dial()
的函數,這個函數會返回兩個值給我們,那么我們只需要其中的一個值即可,另一個值我們用不到,但是因為是返回值,代碼規則里面我們要接收,所以這時候我們就可以用匿名變量來占住另一個值的位置,代碼如下。
案例
package main import ( "fmt" "net" ) func main() { //conn, err := net.Dial("tcp", "127.0.0.1:8080") //如果不想接收err的值,那么可以使用_表示,這就是匿名變量 conn, _ := net.Dial("tcp", "127.0.0.1:8080") fmt.Println(conn) }
這里的net.Dial()
函數就有兩個返回值,分別為conn,err
,那么我們只需要conn
這個返回值的時候,我們就可以利用到匿名變量
來占位獲取到另一個返回值,但是我們可以不需要用到這個返回值。
一個變量(常量、類型或函數)在程序中都有一定的作用范圍,稱之為作用域
首先Go語言的特殊性導致在編譯的過程中如果出現你定義的變量、常量、函數等沒有被使用的話,編譯是無法通過的,所以了解作用范圍是很有必要的。
了解作用域可以更好的定義你需要使用的內容,也可以解決一些編譯過程中的錯誤。
根據定義的位置總結三種
函數內定義的變量稱為局部變量
函數外定義的變量稱為全局變量
函數定義中的變量稱為形式參數
所謂的函數可以暫時先理解成一塊代碼片段,比如我們案例中常用的main()
就是函數
將內容定義在函數的{ }
內,就可以稱之為定義在函數體內。
在函數體內聲明的變量稱之為局部變量,它們的作用域只在函數體內,函數的參數和返回值變量都屬于局部變量。
(擴展)局部變量不是一直存在的,它只在定義它的函數被調用后存在,函數調用結束后這個局部變量就會被銷毀。
案例
package main import "fmt" func main() { // 定義變量,以下這些定義在main()函數中的都可以稱之為局部變量 a := 10 b := 20 c := a + b // 輸出局部變量 fmt.Println("輸出局部變量為:", a, b, c) }
在函數體外聲明的變量稱之為全局變量,全局變量只需要在一個源文件中定義,就可以在所有源文件中使用,當然,不包含這個全局變量的源文件需要使用“import”關鍵字引入全局變量所在的源文件之后才能使用這個全局變量。
全局變量聲明必須以 var 關鍵字開頭,如果想要在外部包中使用(也就是想要被別的包進行import引用),那么全局變量的首字母必須大寫。
案例
package main import "fmt" // 定義全局變量,必須有var關鍵字,并且在函數體外面 var a = 10 var b = "let's go" func main() { // 在main()函數中調用a、b fmt.Println("輸出全局變量為:", a, b) demo() } func demo() { // 因為是全局使用,在要在這個源碼中我們的方法都能調用到 // 因此我在sum()函數中也可以調用到b變量的值 fmt.Println("調用sum()函數輸出的全局變量為:", b) }
可以看到如上案例,無論是在main()
函數中還是在我們的demo()
函數中,我們都可以得到a、b
的值進行輸出
使用細節:關于全局與局部同名怎么辦?
大家可能會思考一個問題,如果我有一個全局變量叫a
,同時我又在函數中也定義了一個局部變量a
,這兩個變量的名字相同但是值不同,那么我們程序應該采用誰?
其實大部分時候遇到這種情況,程序當中遵循的一般都是就近原則
,也就是說很多時候我們的程序是誰離得近,就用誰。
也就說出現如上情況我們會優先先采用離得近的局部變量
案例
package main import "fmt" var a = "這是全局變量" func main() { a := "這是局部變量" fmt.Println("在main中會采用的變量是:", a) demo() } func demo() { fmt.Println("如果沒有局部變量影響: ", a) }
得到的結果是:
在main中會采用的變量是: 這是局部變量
如果沒有局部變量影響: 這是全局變量
注意:雖然這種情況會出現,但是還是不要出現這種讓人容易產生歧義的代碼,規則雖然沒有不允許但是代碼規范上顯然這樣是不對的
在定義函數時函數名后面括號中的變量叫做形式參數(簡稱形參)。形式參數只在函數調用時才會生效,函數調用結束后就會被銷毀,在函數未被調用時,函數的形參并不占用實際的存儲單元,也沒有實際值。
形式參數某種意義上也是一個被聲明的局部變量,所以我們在定義局部變量的時候不要出現局部變量與形式參數重名的情況為好。
案例
package main import "fmt" // 定義了全局變量 var a = "這是全局變量" func main() { // 這里是局部變量 a := "這是main的局部變量a" b := "這是main的局部變量b" fmt.Println("輸出變量的值為: ", a, b) // 在調用test()函數的時候傳遞局部變量a、b的值 test(a, b) } // 在函數中定義形參a、b,那么當test()函數被調用的時候 // 形參就可以直接被當作局部變量來使用,值則是由調用者的傳遞內容來決定的 func test(a, b string) { // 輸出結果 fmt.Println("這是由main傳過來的內容:", a, b) }
得到的輸出結果為:
輸出變量的值為: 這是main的局部變量a 這是main的局部變量b
這是由main傳過來的內容: 這是main的局部變量a 這是main的局部變量b
通過上述案例,讓我們對 局部變量 、 全局變量 、 形式參數 有一個了解,并且分清楚他們之間的區別和使用
在我們開始介紹代碼中的常量的時候,我們要先闡述一下什么叫做常量?
實際上所謂的常量就是一個不會改變的值,用來存儲一些我們自己事先規定好、不會改變的值
Go語言中的常量使用關鍵字const
定義,用于存儲不會改變的數據,常量是在編譯時被創建的,即使定義在函數內部也是如此,并且只能是布爾型、數字型(整數型、浮點型和復數)和字符串型。
由于編譯時的限制,定義常量的表達式必須為能被編譯器求值的常量表達式
語法
// 注意了 []表示 數據類型 可寫,可不寫 const 常量名 [數據類型] = 值
從之前的變量聲明中我們可以知道,其實Go語言很多時候想要簡化一些批量性的動作,因此在定義常量的時候也可以采用批量式的定義。
批量定義的語法
const ( 常量名1 = 值1 常量名2 = 值2 ... )
所有常量的運算都可以在編譯期完成,這樣不僅可以減少運行時的工作,也方便其他代碼的編譯優化,當操作數是常量時,一些運行時的錯誤也可以在編譯時被發現,例如整數除零、字符串索引越界、任何導致無效浮點數的操作等。
案例
// 單個定義常量 const pi= 3.14159 // 批量定義常量 const ( e = 2.7182818 pi = 3.1415926 )
其實在使用常量的過程中,我們除了采用批量定義的方式來定義常量,我們還可以用另一種方式在批量定義常量的同時,簡化常量初始化(賦值)的過程。
簡單來說,假設我要定義a、b、c、d
四個常量。a、b的值都定義為10,c、d的值都定義為20,那么我們在初始化的時候就可以進行一些簡化操作。
案例解析
package main import "fmt" const ( a = 10 b c = 20 d ) func main() { fmt.Println("輸出定義的常量:", a, b, c, d) }
最終得到的輸出結果為:
輸出定義的常量: 10 10 20 20
常量聲明可以使用 iota 常量生成器初始化,它用于生成一組以相似規則初始化的常量,但是不用每行都寫一遍初始化表達式。
簡單來說呢,就是有點類似于計數器的存在,在定義第一個常量的時候會被歸置為0,然后依此累加1
需求
我們從需求出發可能更好理解這個iota
假設我們要定義常量為周一到周天,那么周一為0,依次類推周天為6。
案例解析
package main import "fmt" // 定義周一到周天 const ( Monday = iota Tuesday Wednesday Thursday Friday Saturday Sunday //6 ) func main() { fmt.Println("輸出日期的值為:", Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday) }
輸出的結果為:
輸出日期的值為: 0 1 2 3 4 5 6
當然我們知道iota
的初始值默認歸0,但是只要你在第一步對iota進行運算操作,比如Monday = iota+1
,那么你可以發現在改變初始值的情況下,后續的值也會陸續發生改變,可以動手試試哦!
到此,關于“Go語言的變量與常量怎么定義”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。