Go基礎系列(7):常量和變數

來源:互聯網
上載者:User

標籤:world   als   更改   command   計算   ber   產生   出現   操作   

常量(Constants)和iota

常量包含不會發生更改的資料。常量的資料類型只能是boolean、number(int/float/complex)或string。

定義方式:

const NAME [TYPE] = VALUE

TYPE基本可以省略,因為常量都是單一資料型別,編譯器可以根據值推斷出它的資料類型。

例如:

const Pi = 3.14159

常量在編譯期間被評估,因此定義的常量必須是在編譯期間就能計算出來的結果。例如調用一些運行期間的函數來產生常量的值就是錯誤的,因為在編譯期間無法調用這些運行期間的函數。常量的值定義好後,無法在運行期間更改,否則會報錯。

const c = 3+2          // 正確const d = getNumber()  // 錯誤

常量的精度可以隨意長,Go不會出現精度溢出的問題。且常量賦值時,如果值太長,可以使用續行符\

const Ln2= 0.693147180559945309417232121458            176568075500134360255254120680009const Log2E= 1/Ln2const Billion = 1e9

Go中只有將超出變數精度的值賦值給變數時才會出現溢出問題。

可以一次性定義多個常量:

const beef, two, c = "meat", 2, "veg"const Monday, Tuesday, Wednesday = 1, 2, 3const (    Monday, Tuesday, Wednesday = 1, 2, 3    Thursday, Friday, Saturday = 4, 5, 6)

常量可以用枚舉。定義了下面的常量後,Female就代表了數值1。

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

可以使用iota實現枚舉,iota自身是builtin包中定義的一個常量,其值為0,它用於在常量中定義序列數,從0開始增加:

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

iota第一次調用時,產生數值0,在新行中再次調用iota,將自動增加1,所以上面的a=0,b=1,c=2。上面的常量枚舉可以簡寫成等價形式:

const (    a = iota    b    c)

iota不能用於運行期間,因為它是小寫字母開頭的常量,不會被匯出。下面的代碼會報錯:iota未定義

var a int = iota

iota也可以用於運算式中,例如iota+50表示將當前的iota值加上50。

每個常量塊(const block)結構都會重設和初始化iota的值為0

func main() {    const a = iota           // a=0    const b = iota + 3       // b=3    const c,d = iota,iota+3  // c=0,d=3    const (        e = iota           // e=0        f = iota + 4       // f=5        g                  // g=6    )    println(a,b,c,d,e,f,g)}
變數

在使用變數之前,有兩個過程:聲明變數、變數賦值。聲明變數也常被稱為"定義變數"。變數聲明後必須使用,否則會報錯。

定義變數的常用方式:

var identifier type

例如:

var a intvar b boolvar str string// 或者var (    a int    b bool    str string)

當變數聲明的時候,會做預設的賦0初始化,每種資料類型的預設賦0初始化的0值不同。例如int類型的0值為數值0,float的0值為0.0,string類型的0值為空白"",bool類型的0值為false,資料結構的0值為nil,struct的0值為空白結構。

變數在編譯期間就可以擷取到它的值,但如果賦值給變數的值需要經過運行期間的計算,則需要延遲到運行期間才能擷取對應的值。

var a int = 15     // 編譯期間賦值好var b int = 15/3   // 編譯期間賦值好var c = getNumber() // 運行期間才賦值

聲明和賦值可以結合:

var a int = 15var i = 5var b bool = falsevar str string = "Hello World"

聲明和賦值結合的時候,對於單一資料型別的值,可以省略type部分,因為Go可以根據值自己推斷出類型:

var a = 15var b = falsevar str = "Hello World"var (    a = 15    b = false    str = "Hello World"    numShips = 50    city string)

因為要推斷資料類型,所以類型推斷操作是在運行期間完成的。

在使用推斷類型的賦值時,如果想要指定特定類型,需要顯式指定。例如整數數值推斷的類型為int,要想讓它儲存到int64中,則必須顯式指定類型:

var a int64 = 2

要推斷類型必須是聲明和賦值一起的,否則沒有值,無法根據值去推斷。例如var a是錯的。

除了上面的推斷方式,通過:=符號也能實現聲明和賦值結合,它也會根據資料類型進行推斷,連var關鍵字都省略了:

a := 50

需要注意的是,變數聲明之後不能再次聲明(除非在不同的範圍),之後只能使用=進行賦值。例如,執行下面的代碼將報錯:

package mainimport ("fmt")func main(){    x:=10    fmt.Println("x =",x)    x:=11    fmt.Println("x =",x)}

錯誤如下:

# command-line-arguments.\test.go:8:3: no new variables on left side of :=

報錯資訊很明顯,:=左邊沒有新變數。

如果仔細看上面的報錯資訊,會發現no new variables是一個複數。實際上,Go允許我們使用:=一次性聲明、賦值多個變數,而且只要左邊有任何一個新變數,文法就是正確的。

func main(){    name,age := "longshuai",23    fmt.Println("name:",name,"age:",age)        // name重新賦值,因為有一個新變數weight    weight,name := 90,"malongshuai"    fmt.Println("name:",name,"weight:",weight)}

需要注意,name第二次被:=賦值,Go第一次推斷出該變數的資料類型之後,就不允許:=再改變它的資料類型,因為只有第一次:=對name進行聲明,之後所有的:=對name都只是簡單的賦值操作。

例如,下面將報錯:

weight,name := 90,80

錯誤資訊:

.\test.go:11:14: cannot use 80 (type int) as type string in assignment

另外,變數聲明之後必須使用,否則會報錯,因為Go對規範的要求非常嚴格。例如,下面定義了weight但卻沒使用:

weight,name := 90,"malongshuai"fmt.Println("name:",name)

錯誤資訊:

.\test.go:11:2: weight declared and not used
變數範圍(scope)
  • 定義在函數內部的變數為局部變數,只在函數內部可見
  • 定義在代碼塊內(如{...CODE...})的變數也是局部變數,除了代碼塊就消失
  • 定義在代碼塊外、函數外的變數為包變數或者全域變數,它們可以被同一個目錄下同一個包的多個檔案訪問(因為Go中一個目錄下只能定義一個包,但一個包可以分成多個檔案)
    • 如果變數的名稱以小寫字母開頭,則其它包不能訪問該變數
    • 如果變數的名稱以大寫字母開頭,則其它包可以訪問該變數

不同scope的變數名可以衝突,但建議採取名稱唯一的方式為變數命名。

Go基礎系列(7):常量和變數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.