目录
1. 指针
C/C++Go
Go
Go
传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算。
Go
1.1 指针地址和指针类型
Go&
Gointfloatboolstringarraystruct*int*int64*string
取变量指针的语法如下:
ptr := &v // v的类型为T
其中:
vTptrptr*TT*
package main import "fmt" func main() { a := 10 b := &a fmt.Printf("a:%d ptr:%p\n", a, &a) // a:10 ptr:0xc00001a078 fmt.Printf("b:%p type:%T\n", b, b) // b:0xc00001a078 type:*int fmt.Println(&b) // 0xc00000e018 }
1.2 指针取值
&*
package main import "fmt" func main() { //指针取值 a := 10 b := &a // 取变量a的地址,将指针保存到b中 fmt.Printf("type of b: %T\n", b) c := *b // 指针取值(根据指针去内存取值) fmt.Printf("type of c: %T\n", c) fmt.Printf("value of c: %v\n", c) }
输出结果:
type of b: *int
type of c: int
value of c: 10
&*&*
变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
&*
package main import "fmt" func p1(n int) { n = 100 } func p2(n *int) { *n = 100 } func main() { a := 10 p1(a) fmt.Println(a) // 10 p2(&a) fmt.Println(a) // 100 }
1.3 空指针
nil
package main import "fmt" func main() { var p *string fmt.Printf("p的值是%v \n", p) if p != nil { fmt.Println("非空指针") } else { fmt.Println("空指针") } }
1.4 new 的使用
new
func new(Type) *Type
其中:
Typenew*Typenew
newnew
func main() { a := new(int) b := new(bool) fmt.Printf("%T\n", a) // *int fmt.Printf("%T\n", b) // *bool fmt.Println(*a) // 0 fmt.Println(*b) // false }
var a *intanewa
func main() { var a *int a = new(int) *a = 10 fmt.Println(*a) }
makenewslicemapchan
1.5 new与make的区别
makeslicemapchannelnew
2. Map
map
2.1 什么是Map
key,value存储
Mapkeyvaluekeykeyvaluekeyhashkeykeykeyvalue
hash冲突
keyvaluehashkey(xiaoming)=4keyhashkey(xiaowang)4hashkeyhashkey=xiaowang
hash冲突的常见解决方法
keyvaluehashkey(key)keykeykeyhashkey
开放定址(线性探测)和拉链的优缺点
- 拉链法比线性探测处理简单
- 线性探测查找是会被拉链法会更消耗时间
- 线性探测会更加容易导致扩容,而拉链不会
- 拉链存储了指针,所以空间上会比线性探测占用多一点
- 拉链是动态申请存储空间的,所以更适合链长不确定的
2.2 Map 定义
GoMap
map[KeyType]ValueType
其中:
KeyTypeValueType
mapnilmake()
make(map[KeyType]ValueType, [cap])
capmapmap
2.3 map基本使用
mapmap
func main() { scoreMap := make(map[string]int, 8) scoreMap["张三"] = 90 scoreMap["李四"] = 100 fmt.Println(scoreMap) fmt.Println(scoreMap["李四"]) fmt.Printf("type of a: %T\n", scoreMap) }
输出结果:
map[李四:100 张三:90]
100
type of a: map[string]int
map
func main() { userInfo := map[string]string{ "username": "admin", "password": "123456", } fmt.Println(userInfo) }
2.4 map的遍历
Gofor rangemap
func main() { scoreMap := make(map[string]int) scoreMap["张三"] = 90 scoreMap["李四"] = 100 scoreMap["王五"] = 60 for k, v := range scoreMap { fmt.Println(k, v) } }
key
func main() { scoreMap := make(map[string]int) scoreMap["张三"] = 90 scoreMap["李四"] = 100 scoreMap["王五"] = 60 for k := range scoreMap { fmt.Println(k) } }
map
2.5 map判断某个键是否存在
Gomap
value, ok := map[key]
keyoktruevalueokfalsevalue
func main() { scoreMap := make(map[string]int) scoreMap["张三"] = 90 scoreMap["李四"] = 100 // 如果key存在ok为true,value为对应的值;不存在ok为false,value为值类型的零值 value, ok := scoreMap["张三"] if ok { fmt.Println(v) } else { fmt.Println("查无此人") } }
2.6 map使用delete()函数删除键值对
delete()mapdelete()
delete(map, key)
其中:
mapmapkey
func main(){ scoreMap := make(map[string]int) scoreMap["张三"] = 90 scoreMap["李四"] = 100 scoreMap["王五"] = 60 delete(scoreMap, "李四")//将李四: 100从 map 中删除 for k,v := range scoreMap{ fmt.Println(k, v) } }
您可能感兴趣的文章: