這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Golang 基礎文法-基本變數(2)
變數的零值說明
- 數實值型別變數的零值為
0
- 布爾類型變數的零值為
false
- 字串類型變數的零值為
"”
變數的類型轉換文法
golang 中不同類型之間的變數賦值需要顯式的轉換
//文法格式 T(v) 將 v 轉換為 類型 Tvar i int = 32var f float64 = float64(i)var u uint = uint(64)
變數的定義(聲明)
使用 var 聲明
無論在函數內還是函數外,都可以使用 var 聲明變數
基本文法格式為:
var varName varType
var varName = varValue
var varName1, varName2 varType
var varName1, varName2 = varValue1, varValue2
在基本文法格式上可以進行一些靈活組合,但是建議不要用花哨的文法
//聲明但是不初始化(foo 的值為對應變數類型的零值)var foo int;//聲明且初始化(var聲明初始化的時候不需要指定變數類型,編譯器自動根據初始化值確定變數類型)var bar = 3 //推薦寫法var bar int = 3 //合法但是不推薦//聲明 i1, i2 為 int 類型(初始值為 int 類型的零值 0)var i1, i2 int//聲明 i1 和 i2同時賦值為1,2var i1, i2 = 1, 2//聲明 int 類型的 i1,string 類型的 s1var i1, s1 = 1, "a"//聲明一組全域變數,變數可以初始化或者不初始化var( i1, i2 = 1, 2 i3, i4 int s1 = "111221" b1 = true)
快捷文法
只能在函數體內使用快捷文法,函數體外非法
文法格式
varName1 := varValue1
func main(){ //聲明變數 i1並且同時給變數賦值 i1 := 1 //聲明變數 i2,s1並且同時給他們賦值 i2, s1 := 1, "11"}
var聲明和快捷文法聲明需要注意的地方
便捷聲明方法是聲明一個新的變數且賦值,不能用作給 var 聲明的變數賦值
var foo = 1func main(){ foo := 10 //輸出10 使用的局部變數取值 fmt.Println(foo) //PS: 一定要注意下面有語法錯誤 var bar int bar := 11 //便捷方式其實是先聲明一個新變數然後給賦值,但是此時 bar 變數已經存在了不能重複定義}
特殊變數 _
變數 _
用來拋棄忽略某個值,golang 中不允許存在沒有使用的變數
函數多傳回值拋棄
_, r := divide(10, 3)
匯入包不使用(但是會調用匯入包的 init方法)
import( "fmt" _ "os")
常量
常量是指變數一旦定義,在編譯階段它的值就是確定了的,在運行階段是不可以被改變的,golang 中 number|boolean|string 類型可以定義為常量
定義文法
const constantName = value
cosnt constantName constantType = value
const PI = 3.14const Pi float32 = 3.14156
變數類型
golang 中的 基本變數類型主要為 number,bool,string等
Boolean
關鍵詞 bool
用於定義 boolean類型變數,boolean 類型變數的取值只有 true
和 false
, 零值(預設值)為 false
golang 不允許把 boolean 類型轉變為數字類型
數字類型(Numerrical)
Integers
golang 不允許類型不同的變數進行運算,例如 int8類型的變數和 int32類型的變數不能進行加法操作
signed
- int 長度取決於作業系統,32位作業系統是32位,64位作業系統是64位
- rune 它是int32的別名
- int8
- int16
- int32
- int64
unsigned
- uint
- byte 它是 uint8的別名
- uint8
- uint16
- uint32
- uint64
浮點型
注意沒有 float 這個類型
複數(Complex)
字串(string)
goalng 使用 UTF-8作為編碼結合,使用 " 或者 ` 包裹起來的字元就是一個 string
` 定義多行字串
var s1 = "hello"var s2 = `helloword`
string 對象不允許改變值(但是可以給重新賦值),下面的語法錯誤
var s = "hello"s[0] = 'c'
如果要改變一個變數的值,需要使用舊的變數建立
s := "heloo"c := byte(s) //string 轉換為[]byte 類型c[0] = 'c's2 := string(c) //把 c []byte 轉為 stringfmt.Printf("%s\s\n", s2)
+
可以用來拼接兩個字串
s := "hello, "m := "world"a := s + mfmt.Printf("%s\n", a)//輸出 "cello, "s = "c" + s[1:] //返回 "c" + s從索引1到結束的字串拼接
Error(golang 內建,其他語言沒有的)
golang沒有 try-catch 語句塊處理異常,內建了 error 類型用於處理錯誤
err := errors.New("some error messaage")if err != nil { //TODO something}
其他
分組定義
如果你想定義多個常量,變數或者匯入多個包,可以使用分組格式
//以下是非分組形式import "fmt"import "os"const i = 100const pi = 3.145var i intvar pi float32var prefix string//分組形式import( "fmt" "os")const( pi = 3.145 prefix = "GO")var( pi float32 prefix string)
iota 枚舉
關鍵字 iota 可以產生枚舉類型,枚舉值從0開始,每次加1
const( //x == 0 x = iota //y == 1 y = iota //z == 2 z = iota //如果常量名稱後面沒有任何錶達式 //則 w 等價於 w = iota, w == 3 w ) const v = iota //v == 0 //PS 注意在同一行時的 iota 特殊情況 const( //如果 iota 在同一行,則 e == f == g == 0 e, f, g = iota, iota, iota )
變數的可見度
- 任何以大寫字母開頭的變數都是可以被匯出的,即在包外能被訪問,
- 函數或者常量大寫字母開頭的,也是可以被匯出的,包外可以訪問的
- golang 中沒有 public 或者 private 來控制變數函數常量等的可見度,通過變數函數常量的名稱的首字母是否大小寫來判斷
package test//Foo 在包 test 之外可以通過 test.Foo 訪問var Foo//bar 在包 test 之外通過 test.bar 訪問是錯誤的,因為它的首字母是小寫,包外不可見var bar//函數在test 包外可以使用 test.Test1()訪問func Test1(){}//函數在 test 包外不可以通過 test.test2()訪問,只可以在包內使用func test2(){}//包外使用 test.I訪問Const I = 1// j 不可以在包外通過 test.j 訪問cont j = 10