中文字幕一区二区人妻电影,亚洲av无码一区二区乱子伦as ,亚洲精品无码永久在线观看,亚洲成aⅴ人片久青草影院按摩,亚洲黑人巨大videos

Go 語(yǔ)言變量

變量來(lái)源于數(shù)學(xué),是計(jì)算機(jī)語(yǔ)言中能儲(chǔ)存計(jì)算結(jié)果或能表示值抽象概念。

變量可以通過(guò)變量名訪問(wèn)。

Go 語(yǔ)言變量名由字母、數(shù)字、下劃線組成,其中首個(gè)字符不能為數(shù)字。

聲明變量的一般形式是使用 var 關(guān)鍵字:

var identifier type

可以一次聲明多個(gè)變量:

var identifier1, identifier2 type

實(shí)例

package main
import "fmt"
func main() {
? ? var a string = "Runoob"
? ? fmt.Println(a)

? ? var b, c int = 1, 2
? ? fmt.Println(b, c)
}

以上實(shí)例輸出結(jié)果為:

Runoob
1 2

變量聲明

第一種,指定變量類(lèi)型,如果沒(méi)有初始化,則變量默認(rèn)為零值。

var v_name v_type
v_name = value

零值就是變量沒(méi)有做初始化時(shí)系統(tǒng)默認(rèn)設(shè)置的值。

實(shí)例

package main
import "fmt"
func main() {

? ? // 聲明一個(gè)變量并初始化
? ? var a = "JSON"
? ? fmt.Println(a)

? ? // 沒(méi)有初始化就為零值
? ? var b int
? ? fmt.Println(b)

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

以上實(shí)例執(zhí)行結(jié)果為:

JSON
0
false
  • 數(shù)值類(lèi)型(包括complex64/128)為 0

  • 布爾類(lèi)型為 false

  • 字符串為 ""(空字符串)

  • 以下幾種類(lèi)型為 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 是接口

實(shí)例

package main

import "fmt"

func main() {
? ? var i int
? ? var f float64
? ? var b bool
? ? var s string
? ? fmt.Printf("%v %v %v %qn", i, f, b, s)
}

輸出結(jié)果是:

0 0 false ""

第二種,根據(jù)值自行判定變量類(lèi)型。

var v_name = value

實(shí)例

package main
import "fmt"
func main() {
? ? var d = true
? ? fmt.Println(d)
}

輸出結(jié)果是:

true

第三種,省略 var, 注意 := 左側(cè)如果沒(méi)有聲明新的變量,就產(chǎn)生編譯錯(cuò)誤,格式:

v_name := value

例如:

var intVal int 

intVal :=1 // 這時(shí)候會(huì)產(chǎn)生編譯錯(cuò)誤

intVal,intVal1 := 1,2 // 此時(shí)不會(huì)產(chǎn)生編譯錯(cuò)誤,因?yàn)橛新暶餍碌淖兞?,因?yàn)?:= 是一個(gè)聲明語(yǔ)句

可以將 var f string = "Runoob" 簡(jiǎn)寫(xiě)為 f := "Runoob":

實(shí)例

package main
import "fmt"
func main() {
? ? f := "Runoob" // var f string = "Runoob"

? ? fmt.Println(f)
}

輸出結(jié)果是:

Runoob

多變量聲明

//類(lèi)型相同多個(gè)變量, 非全局變量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3

var vname1, vname2, vname3 = v1, v2, v3 // 和 python 很像,不需要顯示聲明類(lèi)型,自動(dòng)推斷

vname1, vname2, vname3 := v1, v2, v3 // 出現(xiàn)在 := 左側(cè)的變量不應(yīng)該是已經(jīng)被聲明過(guò)的,否則會(huì)導(dǎo)致編譯錯(cuò)誤


// 這種因式分解關(guān)鍵字的寫(xiě)法一般用于聲明全局變量
var (
    vname1 v_type1
    vname2 v_type2
)

實(shí)例

package main

var x, y int
var ( ?// 這種因式分解關(guān)鍵字的寫(xiě)法一般用于聲明全局變量
? ? a int
? ? b bool
)

var c, d int = 1, 2
var e, f = 123, "hello"

//這種不帶聲明格式的只能在函數(shù)體中出現(xiàn)
//g, h := 123, "hello"

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

以上實(shí)例執(zhí)行結(jié)果為:

0 0 0 false 1 2 123 hello 123 hello

值類(lèi)型和引用類(lèi)型

所有像 int、float、bool 和 string 這些基本類(lèi)型都屬于值類(lèi)型,使用這些類(lèi)型的變量直接指向存在內(nèi)存中的值:

4.4.2_fig4.1

當(dāng)使用等號(hào) = 將一個(gè)變量的值賦值給另一個(gè)變量時(shí),如:j = i,實(shí)際上是在內(nèi)存中將 i 的值進(jìn)行了拷貝:

4.4.2_fig4.2

你可以通過(guò) &i 來(lái)獲取變量 i 的內(nèi)存地址,例如:0xf840000040(每次的地址都可能不一樣)。值類(lèi)型的變量的值存儲(chǔ)在棧中。

內(nèi)存地址會(huì)根據(jù)機(jī)器的不同而有所不同,甚至相同的程序在不同的機(jī)器上執(zhí)行后也會(huì)有不同的內(nèi)存地址。因?yàn)槊颗_(tái)機(jī)器可能有不同的存儲(chǔ)器布局,并且位置分配也可能不同。

更復(fù)雜的數(shù)據(jù)通常會(huì)需要使用多個(gè)字,這些數(shù)據(jù)一般使用引用類(lèi)型保存。

一個(gè)引用類(lèi)型的變量 r1 存儲(chǔ)的是 r1 的值所在的內(nèi)存地址(數(shù)字),或內(nèi)存地址中第一個(gè)字所在的位置。

4.4.2_fig4.3

這個(gè)內(nèi)存地址為稱之為指針,這個(gè)指針實(shí)際上也被存在另外的某一個(gè)字中。

同一個(gè)引用類(lèi)型的指針指向的多個(gè)字可以是在連續(xù)的內(nèi)存地址中(內(nèi)存布局是連續(xù)的),這也是計(jì)算效率最高的一種存儲(chǔ)形式;也可以將這些字分散存放在內(nèi)存中,每個(gè)字都指示了下一個(gè)字所在的內(nèi)存地址。

當(dāng)使用賦值語(yǔ)句 r2 = r1 時(shí),只有引用(地址)被復(fù)制。

如果 r1 的值被改變了,那么這個(gè)值的所有引用都會(huì)指向被修改后的內(nèi)容,在這個(gè)例子中,r2 也會(huì)受到影響。


簡(jiǎn)短形式,使用 := 賦值操作符

我們知道可以在變量的初始化時(shí)省略變量的類(lèi)型而由系統(tǒng)自動(dòng)推斷,聲明語(yǔ)句寫(xiě)上 var 關(guān)鍵字其實(shí)是顯得有些多余了,因此我們可以將它們簡(jiǎn)寫(xiě)為 a := 50 或 b := false。

a 和 b 的類(lèi)型(int 和 bool)將由編譯器自動(dòng)推斷。

這是使用變量的首選形式,但是它只能被用在函數(shù)體內(nèi),而不可以用于全局變量的聲明與賦值。使用操作符 := 可以高效地創(chuàng)建一個(gè)新的變量,稱之為初始化聲明。

注意事項(xiàng)

如果在相同的代碼塊中,我們不可以再次對(duì)于相同名稱的變量使用初始化聲明,例如:a := 20 就是不被允許的,編譯器會(huì)提示錯(cuò)誤 no new variables on left side of :=,但是 a = 20 是可以的,因?yàn)檫@是給相同的變量賦予一個(gè)新的值。

如果你在定義變量 a 之前使用它,則會(huì)得到編譯錯(cuò)誤 undefined: a。

如果你聲明了一個(gè)局部變量卻沒(méi)有在相同的代碼塊中使用它,同樣會(huì)得到編譯錯(cuò)誤,例如下面這個(gè)例子當(dāng)中的變量 a:

實(shí)例

package main

import "fmt"

func main() {
? ?var a string = "abc"
? ?fmt.Println("hello, world")
}

嘗試編譯這段代碼將得到錯(cuò)誤 a declared and not used。

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

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

會(huì)移除錯(cuò)誤。

但是全局變量是允許聲明但不使用的。 同一類(lèi)型的多個(gè)變量可以聲明在同一行,如:

var a, b, c int

多變量可以在同一行進(jìn)行賦值,如:

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

上面這行假設(shè)了變量 a,b 和 c 都已經(jīng)被聲明,否則的話應(yīng)該這樣使用:

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

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

這被稱為 并行 或 同時(shí) 賦值。

如果你想要交換兩個(gè)變量的值,則可以簡(jiǎn)單地使用 a, b = b, a,兩個(gè)變量的類(lèi)型必須是相同。

空白標(biāo)識(shí)符 _ 也被用于拋棄值,如值 5 在:_, b = 5, 7 中被拋棄。

_ 實(shí)際上是一個(gè)只寫(xiě)變量,你不能得到它的值。這樣做是因?yàn)?Go 語(yǔ)言中你必須使用所有被聲明的變量,但有時(shí)你并不需要使用從一個(gè)函數(shù)得到的所有返回值。

并行賦值也被用于當(dāng)一個(gè)函數(shù)返回多個(gè)返回值時(shí),比如這里的 val 和錯(cuò)誤 err 是通過(guò)調(diào)用 Func1 函數(shù)同時(shí)得到:val, err = Func1(var1)。