一。变量
1.变量
2.常量
3.基本类型
4.引用类型
5.类型转换
6.字符串
7.指针
8.自定义类型
1.多变量赋值时,先计算所有相关值,然后再从左到右依次赋值。
data, i := [3]int{0, 1, 2}, 0
i, data[i] = 2, 100 // (i = 0) -> (i = 2), (data[0] = 100)
2.编译器会将未使用的局部变量当做错误。
var s string // 全局变量没问题。
func main() {
i := 0 // Error: i declared and not used。 (可使用"_ = i" 规避)
}
3.在常量组中,如不提供类型和初始化值,那么视作与上一常量相同。
const (
s = "abc"
x // x = "abc"
)
4.如果iota 自增被打断,须显示恢复。
const (
A = iota // 0
B // 1
C = "c" // c
D // c,与上一行相同。
E = iota // 4,显式恢复。注意计数包含了 C、 D 两行。
F // 5
)
5.可通过自定义类型来实现枚举类型限制。
package main
import "fmt"
type Color int
const(
Black Color = iota
Red
Blue
)
func test(c Color){
fmt.Printf("test func\n")
fmt.Println(c)
}
func main() {
c:=Black
test(c)
test(1)//Ok,常量会被编译器自动转换。
x:=1
test(x)//Error: cannot use x (type int) as type Color in function argument
}
6.不支持隐式转换,即便是从窄向宽转换也不行。
var b byte = 100
// var n int = b // Error: cannot use b (type byte) as type int in assignment
var n int = int(b) // 显式转换
同样,不能将其他类型当bool值使用。
a := 100
if a { // Error: non-bool a (type int) used as if condition
println("true")
}
rune是int32的别名 7.要修改字符串,可先将其转换成 []rune 或 []byte,完成后再转换为 string。无论哪种转换,都会重新分配内存,并复制字节数组。
func main() {
s := "abcd"
bs := []byte(s)
bs[1] = 'B'
println(string(bs))
u := "电脑"
us := []rune(u)
us[1] = '话'
println(string(us))
}
8.用 for
循环遍历字符串时,也有 byte
和 rune 两种⽅式。
func main() {
s := "abc汉字"
for i := 0; i < len(s); i++ { // byte
fmt.Printf("%c,", s[i])
}
fmt.Println()
for _, r := range s { // rune
fmt.Printf("%c,", r)
}
}
输出:
a,b,c,æ,±,,å,,,
a,b,c,汉,字,
9.指针
• 默认值
nil,没有 NULL
常量。
• 操作符 "&"
取变量地址, "*"
透过指针访问⺫标对象。
• 不⽀持指针运算,不⽀持
"->" 运算符,直接⽤ "."
访问⺫标成员。