go数组字符串切⽚数组
数组定义⽅式
var a [3]int                    // 定义长度为3的int型数组, 元素全部为0
var b = [...]int{1, 2, 3}      // 定义长度为3的int型数组, 元素为 1, 2, 3
var c = [...]int{2: 3, 1: 2}    // 定义长度为3的int型数组, 元素为 0, 2, 3
var d = [...]int{1, 2, 4: 5, 6} // 定义长度为6的int型数组, 元素为 1, 2, 0, 0, 5, 6
数组类型包含基础类型和数组长度
数组复制是整体复制
数组名称代表整个数组⽽不是数组起始地址
可以⽤&取起始地址,传参,防⽌⼤量复制
字符串
不可变字节序列,是⼀个只读的字节数组
长度不是字符串类型的⼀部分
默认编码是utf8, for range 语法不⽀持⾮UTF8编码字符串的遍历
字符串复制不会涉及底层数组复制,参考下⾯字符串的结构体, data指针和len长度的复制len(s)求的是[]byte的长度
字符串底层[]byte, rune底层int32
[]rune 是⼀个 []int32, rune表⽰每个Unicode码点,⽬前只⽤了21位
type StringHeader struct {
Data uintptr
Len  int
}
切⽚
切⽚定义
var (
a []int              // nil切⽚, 和 nil 相等, ⼀般⽤来表⽰⼀个不存在的切⽚
b = []int{}          // 空切⽚, 和 nil 不相等, ⼀般⽤来表⽰⼀个空的集合
c = []int{1, 2, 3}    // 有3个元素的切⽚, len和cap都为3
d = c[:2]            // 有2个元素的切⽚, len为2, cap为3
e = c[0:2:cap(c)]    // 有2个元素的切⽚, len为2, cap为3
f = c[:0]            // 有0个元素的切⽚, len为0, cap为3
go语言字符串转数组g = make([]int, 3)    // 有3个元素的切⽚, len和cap都为3
h = make([]int, 2, 3) // 有2个元素的切⽚, len为2, cap为3
i = make([]int, 0, 3) // 有0个元素的切⽚, len为0, cap为3
)
切⽚遍历⽅式
for i := range a {
fmt.Printf("a[%d]: %d\n", i, a[i])
}
for i, v := range b {
fmt.Printf("b[%d]: %d\n", i, v)
}
for i := 0; i < len(c); i++ {
fmt.Printf("c[%d]: %d\n", i, c[i])
}
切⽚复制与字符串⼀样,复制切⽚头信息reflect.SliceHeader
append函数和copy函数组合使⽤
append(s1, s2...), s2⾃动解包,将s2切⽚内数据复制到s1
切⽚⾼效的要点是要降低内存分配的次数,尽量保证append操作不会超出cap的容量避免切⽚内存泄漏
func FindPhoneNumber(filename string) []byte {
b, _ := ioutil.ReadFile(filename)
b = regexp.MustCompile("[0-9]+").Find(b)
return append([]byte{}, b...)
} //⼀个⼩的需求可能导致需要长时间保存整个⽂件数据,可以将结果复制到⼀个新的切⽚
var a []*int{ ... }
a[len(a)-1] = nil // GC回收最后⼀个元素内存
a = a[:len(a)-1]  // 从切⽚删除最后⼀个元素  **若没有第⼆局,被删除的元素依然被底层数组引⽤,      //从⽽导致不能及时被GC回收
为了安全,当两个切⽚类型[]T和[]Y的底层原始切⽚类型不同时,Go语⾔是⽆法直接转换类型的。可以使⽤反射进⾏转换,前提是保证转化的数据安全有效

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。