1. 程式人生 > >go-005-變量

go-005-變量

整數 func 基礎 字型 開始 import open spl 註意

概述

  變量來源於數學,是計算機語言中能儲存計算結果或能表示值抽象概念。變量可以通過變量名訪問。

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

  聲明變量的一般形式是使用 var 關鍵字:

  var identifier type

一、變量聲明

  1、默認形式,聲明後若不賦值,使用默認值

var v_age string
v_age = value

  2、根據值自行判定變量類型  

var v_name = value

  3、省略var, 註意 :=左側的變量不應該是已經聲明過的,否則會導致編譯錯誤。可以高效地創建一個新的變量,稱之為初始化聲明,只能在函數體中出現

v_name := value
// 例如
var a int = 10
var b = 10
c : = 10

二、多變量聲明

//1、類型相同多個變量, 非全局變量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3

//2.和python很像,不需要顯示聲明類型,自動推斷
var vname1, vname2, vname3 = v1, v2, v3

//3.出現在:=左側的變量不應該是已經被聲明過的,否則會導致編譯錯誤,這種不帶聲明格式的只能在函數體中出現
vname1, vname2, vname3 :
= v1, v2, v3
//4.這種因式分解關鍵字的寫法一般用於聲明全局變量
var (
    vname1 v_type1
    vname2 v_type2
)

三、值類型和引用類型

值類型

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

    技術分享

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

    技術分享

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

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

引用類型

  一個引用類型的變量 r1 存儲的是 r1 的值所在的內存地址(數字),或內存地址中第一個字所在的位置。

    技術分享

  這個內存地址為稱之為指針,這個指針實際上也被存在另外的某一個字中。

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

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

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

四、註意事項

  1、局部變量,聲明必須使用

  2、全局變量是允許聲明但不使用

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

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

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

五、常量

  1、基礎定義

  常量是一個簡單值的標識符,在程序運行時,不會被修改的量。

  常量中的數據類型只可以是布爾型、數字型(整數型、浮點型和復數)和字符串型。

  常量的定義格式:

    const identifier [type] = value

  你可以省略類型說明符 [type],因為編譯器可以根據變量的值來推斷其類型。

    •   顯式類型定義: const b string = "abc"
    •   隱式類型定義: const b = "abc"

  2、用作枚舉  

const (
    Unknown = 0
    Female = 1
    Male = 2
)

    數字 0、1 和 2 分別代表未知性別、女性和男性。

  3、常量表達式

    常量可以用len(), cap(), unsafe.Sizeof()常量計算表達式的值。常量表達式中,函數必須是內置函數,否則編譯不過:

package main

import "unsafe"
const (
    a = "abc"
    b = len(a)
    c = unsafe.Sizeof(a)
)

func main(){
    println(a, b, c)
}
//以上實例運行結果為:
//abc 3 16

  4、特殊常量iota

  iota,特殊常量,可以認為是一個可以被編譯器修改的常量。

  在每一個const關鍵字出現時,被重置為0,然後再下一個const出現之前,每出現一次iota,其所代表的數字會自動增加1。

  iota 可以被用作枚舉值:

const (
    a = iota
    b = iota
    c = iota
)

  第一個 iota 等於 0,每當 iota 在新的一行被使用時,它的值都會自動加 1;所以 a=0, b=1, c=2 可以簡寫為如下形式:   

const (
    a = iota
    b
    c
)

  5、iota 用法

技術分享
package main

import "fmt"

func main() {
    const (
            a = iota   //0
            b          //1
            c          //2
            d = "ha"   //獨立值,iota += 1
            e          //"ha"   iota += 1
            f = 100    //iota +=1
            g          //100  iota +=1
            h = iota   //7,恢復計數
            i          //8
    )
    fmt.Println(a,b,c,d,e,f,g,h,i)
}
//以上實例運行結果為:
//0 1 2 ha ha 100 100 7 8
View Code

  6、iota 實例

技術分享
package main

import "fmt"
const (
    i=1<<iota
    j=3<<iota
    k
    l
)

func main() {
    fmt.Println("i=",i)
    fmt.Println("j=",j)
    fmt.Println("k=",k)
    fmt.Println("l=",l)
}
//以上實例運行結果為:
//i= 1
//j= 6
//k= 12
//l= 24
View Code

  iota表示從0開始自動加1,所以i=1<<0,j=3<<1(<<表示左移的意思),即:i=1,j=6,這沒問題,關鍵在k和l,從輸出結果看,k=3<<2,l=3<<3。

go-005-變量