這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前言:本文主要介紹常量和變數的使用,以及關於變數的可見度規則、參考型別和實值型別的區別。
一、常量
常量運算式的值在編譯期計算,而不是在運行期。常量的值不可修改,這樣可以防止在運行期被意外或惡意的修改。
1.1 常量的聲明
常量的定義格式:
const identifier [type] = value
顯式定義常量:
const a string = "Tom"
隱式定義常量:(這裡用了類型推導)
const a = "Tom"
多個相同類型常量定義:
const first_name, last_name = "T", "om"
樣本:
package mainimport ("fmt")const first_name, last_name = "T", "om"func main() {fmt.Printf("My name is :%s%s",first_name,last_name)}
運行結果:
My name is :Tom
1.2 常量運算式的繼承
樣本:
package mainimport ("fmt")const (a = iotabc = iotade)const (f = iota)func main() {fmt.Printf("a = %d\nb = %d\nc = %d\nd = %d\ne = %d\nf = %d",a,b,c,d,e,f)}
結果:
a = 0b = 1c = 2d = 3e = 4f = 0
二、變數
變數是有明確類型的。編譯器會檢查函數調用中,變數類型的正確性。
2.1 變數的聲明
變數聲明的運算式:
var 變數名字 類型 = 運算式
常規變數聲明:
var Name stringName = "Tom"
變數的類型推導:
var Age = 27
變數的省略調用:
Sex := "男"
2.2 多變數的聲明
樣本:
package mainimport "fmt"var Name string//多個變數的聲明var Job,Mail = "DBA","1234568@qq.com"var (Son_Name = "HB"Son_Age = 1Son_sex = "男")func main() {Name = "Tom"var Age = 27Sex := "男"fmt.Printf("My name is %s;My age is %d;My sex is %v;My job is %v;My e-mail is %v\n",Name,Age,Sex,Job,Mail)fmt.Printf("My son name is %s;My son age is %d;My son sex is %v",Son_Name,Son_Age,Son_sex)}
結果:
My name is Tom;My age is 27;My sex is 男;My job is DBA;My e-mail is 1234568@qq.comMy son name is HB;My son age is 1;My son sex is 男
2.3 變數的生命週期
變數的生命週期指的是在程式運行期間變數有效存在的時間間隔。
包變數(全域變數):對於包變數來說,它們的生命週期和整個程式的運行周期是一致的,一個全域變數可以聲明後在整個程式中使用。
局部變數:在函數或塊中聲明的變數,它們只能由在函數或代碼塊中的語句使用。局部變數對於它們自己以外的函數是未知的。函數的參數變數和傳回值變數都是局部變數。它們在函數每次被調用的時候建立。
樣本:
package mainimport "fmt"var Name = "Tom"func main() {Name = "tom"fmt.Printf("My name is %s",Name)}
結果:
My name is tom
在程式中,局部變數和全域變數的名稱可以相同,但函數內部的局部變數的值將優先(也就是說局部變數會覆蓋全域變數)。
三、數組
數組是一個具有相同資料類型的元素組成的固定長度的有序集合。同類型的兩個數組([5]string和[10]string是兩個完全不同的數組)支援"=="和"!="比較,但是不能比較大小。數組元素可以通過索引(位置)來讀取(或者修改),索引從0開始,第一個元素索引為 0,第二個索引為 1,以此類推。
一維數組的聲明方式:
var variable_name [SIZE] variable_type
多維陣列的聲明方式:
var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
樣本:
package mainimport "fmt"func shuzu(x [5]int) {var i,j intfor i = 0; i < 5; i++ {x[i] = x[i] +10}for j = 0; j < 5; j++ {fmt.Printf("數組傳參:Element[%d] = %d\n", j, x[j] )}}func main() {//一維數組m := [5]int{3,4,5,6,7}n := [5]int{3,4,5,6,7}fmt.Printf("數組比較:m = n is %v\n\n",m == n)shuzu(m)var a [10]intvar i,j intfor i=0;i < 10 ; i++ {a[i] = i+10}for j = 0; j < 10; j++ {fmt.Printf("數組賦值:Element[%d] = %d\n", j, a[j] )}//一個三行四列的二維數組b := [3][4]int{{0, 1, 2, 3} , {1, 2, 3, 4} , {2, 3, 4, 5}}for i = 0; i < 3; i++ {for j = 0; j < 4; j++ {fmt.Printf("多維陣列:b[%d][%d] = %d\n",i,j,b[i][j])}}}
結果:
數組比較:m = n is true數組傳參:Element[0] = 13數組傳參:Element[1] = 14數組傳參:Element[2] = 15數組傳參:Element[3] = 16數組傳參:Element[4] = 17數組賦值:Element[0] = 10數組賦值:Element[1] = 11數組賦值:Element[2] = 12數組賦值:Element[3] = 13數組賦值:Element[4] = 14數組賦值:Element[5] = 15數組賦值:Element[6] = 16數組賦值:Element[7] = 17數組賦值:Element[8] = 18數組賦值:Element[9] = 19多維陣列:b[0][0] = 0多維陣列:b[0][1] = 1多維陣列:b[0][2] = 2多維陣列:b[0][3] = 3多維陣列:b[1][0] = 1多維陣列:b[1][1] = 2多維陣列:b[1][2] = 3多維陣列:b[1][3] = 4多維陣列:b[2][0] = 2多維陣列:b[2][1] = 3多維陣列:b[2][2] = 4多維陣列:b[2][3] = 5
為了方便大家交流,本人開通了公眾號(關注看更多精彩)和QQ群,QQ群1(291519319)和QQ群2(659336691)。喜歡技術的一起來交流吧