1. 字典
Go
中的字典和 Java
中的 HashMap
类似,为 key-value
结构,其 key
不能重复,且要能哈希,即为不可变对象(除了字典、切片、函数等外,其他类型基本都可以)
在声明时需要单独指定 key-value
的数据类型,语法格式为:map[KEY_TYPE]VALUE_TYPE
1.1 字典声明
package main
import "fmt"
func main() {
// 方法一
var scores map[string]int = map[string]int{"english": 80, "chinese": 90}
// 方法二
info := map[string]int{"rose": 18, "lila": 19}
// 方法三
phone := make(map[string]int)
phone["iPhone"] = 8000
phone["xiaomi"] = 9000
fmt.Println(scores) // map[chinese:90 english:80]
fmt.Println(info) // map[lila:19 rose:18]
fmt.Println(phone) // map[iPhone:8000 xiaomi:9000]
}
对于声明未初始化的字典,并不能直接赋值,其初始值为 nil
,需要用 make()
函数初始化,才能赋值:
// 声明一个字段,未初始化,不能直接赋值,它的零值为 nil
var aa map[string]int
// 判断是否为 nil
if aa == nil {
// 先用 make() 函数初始化
aa = make(map[string]int)
}
// 再赋值
aa["score"] = 99
aa["age"] = 18
fmt.Println(aa) // map[age:18 score:99]
1.2 字典操作
// 添加/更新元素,若 key 存在则直接更新
aa["score"] = 99
// 获取,key 不存在也不会存在,会返回 value 的零值
aa["score"]
// 删除,key 不存在也不会报错,delete 静默处理
delete(aa, "score")
判断 key 是否存在
判断 key
是否存在,可以用以下方式,第二个值返回 key
是否存在(存在为 true,否则为 false):
info := map[string]int{"rose": 18, "lila": 19}
age, ok := info["john"]
if ok {
fmt.Printf("key: john 存在,其年龄为:%d", age)
} else {
fmt.Printf("key: john 不存在,其年龄为:%d", age) // key: john 不存在,其年龄为:0
}
1.3 字典循环
package main
import "fmt"
func main() {
info := map[string]int{"rose": 18, "lila": 19}
for name, age := range info {
fmt.Printf("name:%s,age:%d\n", name, age)
}
// 只获取 key,不用占位符
for key := range info{
fmt.Println(key)
}
// 只获取 value,要用占位符
for _, value := range info{
fmt.Println(value)
}
}
2. 布尔类型
Go
中布尔类型只有两种值:true、false
,不像 Python
可以用 1、0
等表示,两者也不相等,不过也支持短路运算:
import "fmt"
var age int = 15
var gender string = "male"
func main() {
// && 两边的表达式都会执行
fmt.Println( age > 18 && gender == "male") // false
// gender == "male" 并不会执行
fmt.Println( age < 18 || gender == "male") // true
}