1. 程式人生 > 實用技巧 >Runoob-Go:Go 語言變數

Runoob-Go:Go 語言變數

ylbtech-Runoob-Go:Go 語言變數

1.返回頂部
1、

Go 語言變數

變數來源於數學,是計算機語言中能儲存計算結果或能表示值抽象概念

變數可以通過變數名訪問。

Go 語言變數名由字母、數字、下劃線組成,其中首個字元不能為數字。

宣告變數的一般形式是使用 var 關鍵字:

var identifier type

可以一次宣告多個變數:

var identifier1, identifier2 type

例項

packagemain
import"fmt"
funcmain(){
varastring="Runoob"
fmt.Println(a)

varb,cint=1,2
fmt.Println(b,c)
}

以上例項輸出結果為:

Runoob
1 2

變數宣告

第一種,指定變數型別,如果沒有初始化,則變數預設為零值

var v_name v_type
v_name = value

零值就是變數沒有做初始化時系統預設設定的值。

例項

packagemain
import"fmt"
funcmain(){

// 宣告一個變數並初始化
vara="RUNOOB"
fmt.Println(a)

// 沒有初始化就為零值
varbint
fmt.Println(b)

// bool 零值為 false
varcbool
fmt.Println(c)
}

以上例項執行結果為:

RUNOOB
0
false
  • 數值型別(包括complex64/128)為0

  • 布林型別為false

  • 字串為""(空字串)

  • 以下幾種型別為nil

    var a *int
    var a []int
    var a map[string] int
    var a chan int
    var a func(string) int
    var a error // error 是介面

例項

packagemain

import"fmt"

funcmain(){
variint
varffloat64
varbbool
varsstring
fmt.Printf("%v %v %v %q\n",i,f,b,s)
}

輸出結果是:

0 0 false ""

第二種,根據值自行判定變數型別。

var v_name = value

例項

packagemain
import"fmt"
funcmain(){
vard=true
fmt.Println(d)
}

輸出結果是:

true

第三種,省略 var, 注意:=左側如果沒有宣告新的變數,就產生編譯錯誤,格式:

v_name := value

例如:

var intVal int 

intVal :=1 // 這時候會產生編譯錯誤

intVal,intVal1 := 1,2 // 此時不會產生編譯錯誤,因為有宣告新的變數,因為 := 是一個宣告語句

可以將 var f string = "Runoob" 簡寫為 f := "Runoob"

例項

packagemain
import"fmt"
funcmain(){
f:="Runoob"// var f string = "Runoob"

fmt.Println(f)
}

輸出結果是:

Runoob

多變數宣告

//型別相同多個變數, 非全域性變數
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3

var vname1, vname2, vname3 = v1, v2, v3 // 和 python 很像,不需要顯示宣告型別,自動推斷

vname1, vname2, vname3 := v1, v2, v3 // 出現在 := 左側的變數不應該是已經被宣告過的,否則會導致編譯錯誤


// 這種因式分解關鍵字的寫法一般用於宣告全域性變數
var (
    vname1 v_type1
    vname2 v_type2
)

例項

packagemain

varx,yint
var(// 這種因式分解關鍵字的寫法一般用於宣告全域性變數
aint
bbool
)

varc,dint=1,2
vare,f=123,"hello"

//這種不帶宣告格式的只能在函式體中出現
//g, h := 123, "hello"

funcmain(){
g,h:=123,"hello"
println(x,y,a,b,c,d,e,f,g,h)
}

以上例項執行結果為:

0 0 0 false 1 2 123 hello 123 hello

值型別和引用型別

所有像 int、float、bool 和 string 這些基本型別都屬於值型別,使用這些型別的變數直接指向存在記憶體中的值:

當使用等號=將一個變數的值賦值給另一個變數時,如:j = i,實際上是在記憶體中將 i 的值進行了拷貝:

你可以通過 &i 來獲取變數 i 的記憶體地址,例如:0xf840000040(每次的地址都可能不一樣)。值型別的變數的值儲存在棧中。

記憶體地址會根據機器的不同而有所不同,甚至相同的程式在不同的機器上執行後也會有不同的記憶體地址。因為每臺機器可能有不同的儲存器佈局,並且位置分配也可能不同。

更復雜的資料通常會需要使用多個字,這些資料一般使用引用型別儲存。

一個引用型別的變數 r1 儲存的是 r1 的值所在的記憶體地址(數字),或記憶體地址中第一個字所在的位置。

這個記憶體地址為稱之為指標,這個指標實際上也被存在另外的某一個值中。

同一個引用型別的指標指向的多個字可以是在連續的記憶體地址中(記憶體佈局是連續的),這也是計算效率最高的一種儲存形式;也可以將這些字分散存放在記憶體中,每個字都指示了下一個字所在的記憶體地址。

當使用賦值語句 r2 = r1 時,只有引用(地址)被複制。

如果 r1 的值被改變了,那麼這個值的所有引用都會指向被修改後的內容,在這個例子中,r2 也會受到影響。


簡短形式,使用 := 賦值操作符

我們知道可以在變數的初始化時省略變數的型別而由系統自動推斷,宣告語句寫上 var 關鍵字其實是顯得有些多餘了,因此我們可以將它們簡寫為 a := 50 或 b := false。

a 和 b 的型別(int 和 bool)將由編譯器自動推斷。

這是使用變數的首選形式,但是它只能被用在函式體內,而不可以用於全域性變數的宣告與賦值。使用操作符 := 可以高效地建立一個新的變數,稱之為初始化宣告。

注意事項

如果在相同的程式碼塊中,我們不可以再次對於相同名稱的變數使用初始化宣告,例如:a := 20 就是不被允許的,編譯器會提示錯誤 no new variables on left side of :=,但是 a = 20 是可以的,因為這是給相同的變數賦予一個新的值。

如果你在定義變數 a 之前使用它,則會得到編譯錯誤 undefined: a。

如果你聲明瞭一個區域性變數卻沒有在相同的程式碼塊中使用它,同樣會得到編譯錯誤,例如下面這個例子當中的變數 a:

例項

packagemain

import"fmt"

funcmain(){
varastring="abc"
fmt.Println("hello, world")
}

嘗試編譯這段程式碼將得到錯誤a declared and not used

此外,單純地給 a 賦值也是不夠的,這個值必須被使用,所以使用

fmt.Println("hello, world", a)

會移除錯誤。

但是全域性變數是允許宣告但不使用的。 同一型別的多個變數可以宣告在同一行,如:

var a, b, c int

多變數可以在同一行進行賦值,如:

var a, b int
var c string
a, b, c = 5, 7, "abc"

上面這行假設了變數 a,b 和 c 都已經被宣告,否則的話應該這樣使用:

a, b, c := 5, 7, "abc"

右邊的這些值以相同的順序賦值給左邊的變數,所以 a 的值是 5, b 的值是 7,c 的值是 "abc"。

這被稱為 並行 或 同時 賦值。

如果你想要交換兩個變數的值,則可以簡單地使用a, b = b, a,兩個變數的型別必須是相同。

空白識別符號 _ 也被用於拋棄值,如值 5 在:_, b = 5, 7 中被拋棄。

_ 實際上是一個只寫變數,你不能得到它的值。這樣做是因為 Go 語言中你必須使用所有被宣告的變數,但有時你並不需要使用從一個函式得到的所有返回值。

並行賦值也被用於當一個函式返回多個返回值時,比如這裡的 val 和錯誤 err 是通過呼叫 Func1 函式同時得到:val, err = Func1(var1)。

2、
2.返回頂部
3.返回頂部
4.返回頂部
5.返回頂部
1、 https://www.runoob.com/go/go-variables.html 2、
6.返回頂部
作者:ylbtech
出處:http://ylbtech.cnblogs.com/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。