切片
在Go中由于数组的定长性和值拷贝的特性限制了数组的使用场景,使用Go提供了另外一种数据类型slice(切片),这是一种变长数组。
声明
//由make创建
SliceName := make([]Type,Len,Cap) //可不填写Cap,但会使Cap=Len
//由数组创建
ArrayName := [...]Type{value1,value2,value3}
SliceName := Array[b,e] //b:开始索引 e:结束索引 都可不指定
//直接声明切片类型变量是没有意义的
var a []int //打印结果:[]
//此时array=nil,len=0,cap=0
切片的操作
操作
//长度
len(Slice)
//底层数组容量
cap(Slice)
//添加元素
append(Slice,Value)
//复制切片
copy(Slice1,Slice2)
例子
package main
import "fmt"
func PrintSliceInfo(s1,s2 []int){
fmt.Println("--------------")
fmt.Println("s1:",s1)
fmt.Println("s2:",s2)
fmt.Println("s1 cap:",cap(s1))
fmt.Println("s2 cap:",cap(s2))
fmt.Println("s1 len:",len(s1))
fmt.Println("s2 len:",len(s2))
fmt.Println("--------------")
}
func main(){
a := [...]int{0,1,2,3,4,5}
s1 := make([]int,3,6)
s2 := a[3:]
PrintSliceInfo(s1,s2)
s1 = append(s1,23)
s2 = append(s2,233)
PrintSliceInfo(s1,s2)
s3 := make([]int,3,4)
copy(s3,s2)
fmt.Println("--------------")
fmt.Println("s3:",s3)
fmt.Println("s3 len:",len(s3))
fmt.Println("s3 cap:",cap(s3))
fmt.Println("--------------")
}
//打印结果
--------------
s1: [0 0 0]
s2: [3 4 5]
s1 cap: 6
s2 cap: 3
s1 len: 3
s2 len: 3
--------------
--------------
s1: [0 0 0 23]
s2: [3 4 5 233]
s1 cap: 6
s2 cap: 8
s1 len: 4
s2 len: 4
--------------
--------------
s3: [3 4 5]
s3 len: 3
s3 cap: 4
--------------
字典
声明
//通过字面量创建
MapName := map[Type1]Type2{"key":value,"key2",value2}
//通过Make创建
MapName := make(map[Type1]Type2)
用法
//添加与更新,访问一个键
MapName[key] = value
value := MapName[key]
//删除
delete(MapName,key)
//长度
len(MapName)
//迭代
for key,value := range MapName{
//code
fmt.Println("key=",key,"value=",value)
}
注意
- Go内置的Map不是并发安全的,并发安全可以使用标准包sync中的map
- 不要直接修改map value中的某个元素的的值,如果需要修改,则必须整体重新赋值
- 可以使用range迭代,但不保证每次的迭代顺序相同
结构
Go中的struct(结构)与C类似。
声明
//通过字面量,这种方法用的较少
struct{
FeildName FeildType
FeildName FeildType
FeildName FeildType
}
//通过自定义类型
type TypeName struct{
FeildName FeildType
FeildName FeildType
FeildName FeildType
}
示例
type test struct{
Name String
Age int
}
//不推荐下面的方式来初始化
a := test{"test",23}
//建议使用下面的方法,避免新增字段导致报错,没有赋值的字段默认为零值
c := test{
Name:"test",
Age:23,
}
访问
Value := TypeName.FeildName
注意
- struct中的类型可以是任意类型
- struct的存储空间是连续的,其字段按照声明时的顺序存放(注意字段之间对齐!)
其他要说的
切片的原理
请务必看一下,了解切片的工作原理!
https://www.cnblogs.com/hutusheng/p/5492418.html