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 = true var 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 main import "fmt" import "errors" //引入 errors 包 //声明 bool 型全局变量 var ( enable = true disable = false ) func main() { //预定义常量 iota const ( c0 = iota //0 c1 = iota //0+1 c2 //会自动赋上一个定义常量的值或者表达式 ) const ( c3 = iota //0 c4 ) fmt.Println("c0, c1, c2 = ", c0, c1, c2) fmt.Println("c3, c4 = ", c3, c4) /* //这种写法编译时会报错,需要 if condition { 在同一行代码中 //missing condition in if statement //enable == true not used if 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 assignment enable = 1; // cannot convert 1 to type bool // cannot convert 1 (type int) to type bool // cannot use 1 (type int) as type bool in assignment enable = bool(1) */ var ( a int8 = 1 b int = 2 ) //invalid operation: a + b (mismatched types int8 and int) //c := a + b //需要做类型转换 c := int(a) + b fmt.Println("c = a + b = ", c) //int32 与 int 是两种不同的类型,但是可用强制类型转换 var d int32 //d = b // cannot use b (type int) as type int32 in assignment d = int32(b) fmt.Println("d = ", d) var f1 float32 = 1.23456 fmt.Printf("f1 = %.3f \n", f1) //1.235 f2 := 1.111 //compile error: invalid operation: f1 + f2 (mismatched types float32 and float64 //f3 := f1 + f2 b1 := (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) //cello fmt.Println(s[:3]) //cel fmt.Println(s[1:3]) //el fmt.Println(s[:]) //cello //byte 用 '' 包括字符 //var ch byte = "1" //compile error: cannot use "1" (type string) as type byte in assignment var ch1 byte = 'a' fmt.Printf("ch1 = %c \n", ch1) //ch1 = a fmt.Println(ch1) //97 //rune var ch2 rune = 'b' fmt.Printf("ch2 = %c \n", ch2) //ch2 = b fmt.Println(ch2) //98 //error err := errors.New("error1") if err != nil { //错误处理... fmt.Println(err) } var e1 error if 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 }
运行结果: