目录
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)
}
}
您可能感兴趣的文章: