Go语言的4个内置容器: 数组、切片、map(sync map)、list
以及new和make的区别
//-- Go语言知识点六、Go语言内置的容器数组、切片(动态变化的数组)、列表、字典、以及make和new的区别
func GoContainer() {
// 数组初始化的三种方式
var shuzu [3]string = [3]string{"sd", "ds", "dss"}
var shuzu1 = [3]string{"sd", "ds", "dss"}
// 数组的赋值
shuzu[0] = "s"
fmt.Println("reflect.TypeOf(shuzu)=", reflect.TypeOf(shuzu))
//-- 数组遍历
for i := 0; i < len(shuzu); i++ {
fmt.Println(shuzu[i])
}
//-- 循环遍历数组
for _, v := range shuzu {
fmt.Println(v)
}
//-- 数组的比较
if shuzu == shuzu1 {
println("两个数组相等")
}
//-- 创建切片,(作为函数的参数,类似引用本身,而不是go语言传入数组的拷贝), 指针类型,因为切片是动态变化的数组,所以可以将其动态变化,切片除了长度属性还有一个容量属性。
//-- 指定数组创建切片
var sliceSrc = []string{"sd", "ds", "dss"}
fmt.Println("reflect.TypeOf(qiepian1)=", reflect.TypeOf(sliceSrc))
//-- make创建切片
var sliceDst []string = make([]string, 2, 3)
fmt.Println("sliceDst=", sliceDst)
//-- 可以使用 append 函数加上切片索引的形式实现在切片的任意位置插入元素。也可以用append变相删除元素。
//-- Go语言切片的复制
copy(sliceDst, sliceSrc)
fmt.Println("sliceDst=", sliceDst)
//-- 切片的长度和容量
fmt.Println("len(sliceDst)=", len(sliceDst))
fmt.Println("cap(sliceDst)=", cap(sliceDst))
//-- Go语言中map 如果在并发读的情况下是线程安全的,如果在并发写的情况下,则是线程不安全的。
//--map 无序的: 无序的集合,也可以称为关联数组或字典,Golang 中的 map 能够快速根据给定 key,找到对应的 value 的数据结构。
//使用 TypeOf() 函数,获取map类型
herosMap := map[string]string{
"hero1": "宋江",
"hero2": "卢俊义",
"hero3": "吴用",
}
fmt.Println("hero4", herosMap["hero4"])
herosMap["NotExist"] = "mmp"
value, isOk := herosMap["hero1"]
fmt.Println("Value = ", value, " isOk = ", isOk)
fmt.Println(reflect.TypeOf(herosMap))
//-- 循环遍历map
for key, value := range herosMap {
fmt.Println(key, value)
}
//--删除map中的元素
delete(herosMap, "NotExist")
//-- Golang 为我们提供了一个 sync.Map 是并发写安全的。map 的 key 和 value 的 类型 必须是一致的,但 sync.Map 的 key 和 value 不一定是要相同的类型,不同的类型也是支持的。
//-- 存储、加载、删除数据
var mapHaiCoder sync.Map
mapHaiCoder.Store("Server", "Golang")
mapHaiCoder.Store("JavaScript", "Vue")
mapHaiCoder.Store("Db", "Redis")
fmt.Println(mapHaiCoder)
value2, _ := mapHaiCoder.Load("Server")
fmt.Println("Value =", value2)
mapHaiCoder.Delete("Db")
//-- sync Map的遍历
mapHaiCoder.Range(walk)
//Go 语言中 sync.Map 的 LoadOrStore 函数表示,如果我们获取的 key 存在,那么就返回 key 对应的元素,如果获取的 key 不存在,那么就返回我们设置的值,并且将我们设置的值,存入 map。
mapHaiCoder.LoadOrStore("ServerData", "ServerData")
mapHaiCoder.LoadOrStore("JavaScriptData", "JavaScriptData")
fmt.Println(mapHaiCoder.LoadOrStore("ServerData", "ServerData"))
mapHaiCoder.Range(walk)
//-- Go语言中的list
//通过 list.New 创建列表
listHaiCoder := list.New()
listHaiCoder.PushBack("Hello")
listHaiCoder.PushBack("HaiCoder")
fmt.Println(listHaiCoder)
//使用var关键字初始化列表
var listHaiCoder2 list.List
listHaiCoder2.PushBack("Hello")
listHaiCoder2.PushBack("HaiCoder")
fmt.Println(listHaiCoder2)
//list列表的插入节点、删除节点、遍历列表、移动节点、获取元素节点。获取列表的长度。
//-- go语言new和make的区别
//Go语言的new和make都是go语言的内置函数,主要用来分配内存的。
// new与make的区别是new只分配内存,而make只能用于分配和初始化slice、map、channel 的数据。
// new分配返回的是指针,即类型 *Type. make返回的是引用,即 Type
// new分配的空间会清零,make分配空间后会进行初始化。
}
func walk(key, value interface{}) bool {
fmt.Println("key=", key, "value", value)
//return false 终止遍历
return true // 一直遍历到底
}