這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go 語言中包括以下內建基礎類型:
布爾型:bool
整型:int int64 int32 int16 int8 uint8(byte) uint16 uint32 uint64 uint
浮點型:float32 float64
複數型:complex64 complex128
字串:string
字元型:rune
錯誤型:error
1. bool類型
關鍵字: bool
可定義為: true 或者 false 或者 邏輯運算式
var bool1 bool = truevar bool2 bool = (2 == 2)
註:不能接受其他類型的賦值,包括(0, 1),也不支援自動或強制類型轉換
2. 整型
分為有符號與無符號兩種
值範圍,如: int8 2^8 -128~127, uint8 0~255, 其他以此類推
int/uint 其值範圍與平台有關,所以 int32 != int
支援強制類型轉換,注意精度問題
變數2 = 類型(變數1)
3. 浮點型
即含小數點的資料
有兩種: float32 float64(預設)
可相互轉換,
註:比較大小時最好先確定比較精度, 再比較大小
4. 字串
聲明方式: var str string
值用 "" 或者 `` 包括, `` 可包含多行字串
字串的操作與數組相同
與如php等其他語言不同的是,字串的內容在初始化後,不能被修改,但可重新完全賦值
s := "123"s[1] = "3" //compile error
$s = "123"; $s[1] = "3"; echo $s; //133
5. 字元型
兩種字元類型:
byte 對應 utf-8
rune 對應 unicode
6. 錯誤型
在 go 語言中,負責錯誤資訊處理的是 error 介面,也可以使用 errors 包
var e error = errors.New("...")
在 go 語言中,函數支援多個傳回值
可用下面的方式來處理錯誤
res, err := funName(param)if err != nil { //處理錯誤} else { //無錯誤}func funName(param) (res type, err error) { if ... { err = errors.New(...) return } ... return res, nil}
7. 複數
在此省略,有需要可再瞭解
note_type_1.go code list
package mainimport "fmt"import "errors" //引入 errors 包//聲明 bool 型全域變數var (enable = truedisable = false)func main() {//預定義常量 iotaconst (c0 = iota //0c1 = iota //0+1c2 //會自動賦上一個定義常量的值或者運算式)const (c3 = iota //0c4)fmt.Println("c0, c1, c2 = ", c0, c1, c2)fmt.Println("c3, c4 = ", c3, c4)/*//這種寫法編譯時間會報錯,需要 if condition { 在同一行代碼中//missing condition in if statement //enable == true not usedif enable == true {fmt.Println("error")}*/if enable == true {fmt.Println("enabled = ", enable)} else {fmt.Println("enabled = ", disable)}/*//編譯時間會出現以下錯誤:// cannot use 1 (type int) as type bool in assignmentenable = 1;// cannot convert 1 to type bool // cannot convert 1 (type int) to type bool // cannot use 1 (type int) as type bool in assignmentenable = bool(1)*/var (a int8 = 1b int = 2)//invalid operation: a + b (mismatched types int8 and int)//c := a + b//需要做類型轉換c := int(a) + bfmt.Println("c = a + b = ", c)//int32 與 int 是兩種不同的類型,但是可用強制類型轉換var d int32//d = b // cannot use b (type int) as type int32 in assignmentd = int32(b)fmt.Println("d = ", d)var f1 float32 = 1.23456fmt.Printf("f1 = %.3f \n", f1) //1.235f2 := 1.111//compile error: invalid operation: f1 + f2 (mismatched types float32 and float64//f3 := f1 + f2b1 := (float64(f1) == f2)//該比較方式不嚴謹if b1 {fmt.Println("float64(f1) == f2")} else {fmt.Println("float64(f1) != f2")}//用 "" 括起來表示字串//字串的操作與數組一樣var str string = "hello"fmt.Println("str = ", str)fmt.Println("str[1] = ", str[1])fmt.Printf("%c \n", str[1]) // s[i]取第i+1個字元//str = "hi" //compile ok//str[0] = 'c' //compile error: cannot assign to str[0]//多行字串,用 `` 包含str2 := `SELECT username, pwd FROM tb_user WHERE id = 123456`fmt.Println(str2)str3 := " world!"fmt.Println("str + str3 = ", str + str3) // s1 + s2, 連接字串//len(s)返回字串的長度fmt.Printf("length of str2 = %d \n", len(str2))//s[m:n] 返回從m位開始到n結束之間的字串,m, n可以省略, 此時m為0, n為len(s)s := "hello"s = "c" + s[1:]fmt.Println(s) //cellofmt.Println(s[:3]) //celfmt.Println(s[1:3])//elfmt.Println(s[:])//cello//byte 用 '' 包括字元//var ch byte = "1" //compile error: cannot use "1" (type string) as type byte in assignmentvar ch1 byte = 'a'fmt.Printf("ch1 = %c \n", ch1) //ch1 = afmt.Println(ch1) //97//runevar ch2 rune = 'b'fmt.Printf("ch2 = %c \n", ch2) //ch2 = bfmt.Println(ch2) //98//errorerr := errors.New("error1")if err != nil {//錯誤處理...fmt.Println(err)}var e1 errorif e1 == nil {fmt.Println("no problem")}res, e := div(5, 0)//res, e := div(5, 1)if e != nil {//錯誤處理fmt.Println(e) //如果div(5, 0), 會輸出: error: division by zero} else {//正確fmt.Println("res = ", res) //如果div(5, 1),會輸出: res = 5}}//定義函數func div(a, b int) (res int, e error) {if b == 0 {e = errors.New("error: division by zero")return}return a /b , nil}
運行結果: