變量聲明
官方DOC: http://golang.org//spec#Variable_declarations
Go中使用全新的關鍵字var來聲明變量。var我們並不陌生,在Javascript 和C#中均有出現。不同的是Go和C#中變量屬於強類型,在聲明變量后就不允許改變其數據類型。
聲明變量有多種形態:
-
var a int //聲明一個int類型的變量
-
var b struct { //聲明一個結構體
name string
}
-
var a = 8 //聲明變量的同時賦值,編譯器自動推導其數據類型
-
var a int = 8 //聲明變量的同時賦值
-
var { //批量聲明變量,簡潔
a int
b string
}
變量初始化
變量的初始化工作可以在聲明變量時進行初始化,也可以先聲明后初始化。此時var關鍵字不再是必須的。
初始化變量有多種方式,每種方式有不同的使用場景:
-
在方法中聲明一個臨時變量並賦初值
> var tmpStr = “”
> var tmpStr string = “”
> tmpStr :=””
-
全局中已聲明變量直接賦值
> tmpStr = “<body>”
我們看到有此兩種方式:
-
var name [type] = value
如果不書寫 type ,則在編譯時會根據value自動推導其類型。
-
name := value
這里省略了關鍵字var,我很喜歡這種方式(可以少寫代碼,而沒有任何壞處)。 但這有需要注意的是“ :=” 是在聲明和初始化變量,因此該變量必須是第一次出現,如下初始化是錯誤的。但是要注意賦值時要確定你想要的類型,在Go中不支持隱式轉換的。如果是定義個float64類型的變量,請寫為 v1 :=8.0 而不是v1 :=8 。
-
var a int
a := 8
//我剛開始時老出現這種錯誤,一直將 “:= ” 當作 一般賦值語句處理
思考問題
初始化語句,在編譯器上是如何進行自動類型推導的。一些字面常量是如何歸類的?
如 8 → int , 8.0 → float64
-
package main
import (
"fmt"
"reflect"
)
func main(){
var v1 int = 8
var v2 byte = 8
v3 := 8
v4 := 8.0
fmt.Printf("v1 type :%s\n",reflect.TypeOf(v1)) //int
fmt.Printf("v2 type :%s\n",reflect.TypeOf(v2)) //uint8
fmt.Printf("v3 type :%s\n",reflect.TypeOf(v3)) //int
fmt.Printf("v4 type :%s\n",reflect.TypeOf(v4)) //float64
}
官方文檔: http://golang.org/ref/spec#Constant_expressions
const a = 2 + 3.0 // a == 5.0 (untyped floating-point constant) const b = 15 / 4 // b == 3 (untyped integer constant) const c = 15 / 4.0 // c == 3.75 (untyped floating-point constant) const Θ float64 = 3/2 // Θ == 1.0 (type float64, 3/2 is integer division) const Π float64 = 3/2. // Π == 1.5 (type float64, 3/2. is float division) const d = 1 << 3.0 // d == 8 (untyped integer constant) const e = 1.0 << 3 // e == 8 (untyped integer constant) const f = int32(1) << 33 // f == 0 (type int32) const g = float64(2) >> 1 // illegal (float64(2) is a typed floating-point constant) const h = "foo" > "bar" // h == true (untyped boolean constant) const j = true // j == true (untyped boolean constant) const k = 'w' + 1 // k == 'x' (untyped rune constant) const l = "hi" // l == "hi" (untyped string constant) const m = string(k) // m == "x" (type string) const Σ = 1 - 0.707i // (untyped complex constant) const Δ = Σ + 2.0e-4 // (untyped complex constant) const Φ = iota*1i - 1/1i // (untyped complex constant) const ic = complex(0, c) // ic == 3.75i (untyped complex constant) const iΘ = complex(0, Θ) // iΘ == 1.5i (type complex128) const Huge = 1 << 100 // Huge == 1267650600228229401496703205376 (untyped integer constant) const Four int8 = Huge >> 98 // Four == 4 (type int8)
^1 // untyped integer constant, equal to -2 uint8(^1) // illegal: same as uint8(-2), -2 cannot be represented as a uint8 ^uint8(1) // typed uint8 constant, same as 0xFF ^ uint8(1) = uint8(0xFE) int8(^1) // same as int8(-2) ^int8(1) // same as -1 ^ int8(1) = -2 |
------------------------2013-04-14補充----------------------------------------
2. Go里面的常數是高精度數,分為幾類:
1.有類型的:uint(8),類型顯式指定了,在表達式里面不會變化。
2.無類型的:分成無類型整數和無類型浮點兩類。這兩類在使用的時候會根據上下文需要的類型轉化為實際類型,
比如uint8(0) + 1.0就是uint8(1),但是uint8(0)+1.2就會由於1.2無法轉化為uint8而報錯。
如果上下文無法確定(比如 i, j := 1, 2.0這樣的),那么整數無類型常數轉化為int,浮點數無類型常數轉化為float64.
具體規則參見:
http://tip.golang.org/ref/spec#Constant_expressions |
---------------------------------2013-04-14 end------------------------------------------------
