golang的slice了解及验证
Posted gpan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang的slice了解及验证相关的知识,希望对你有一定的参考价值。
golang 中slice的操作
golang收获
- 如果只是分配了 var st []SelfType, 进行赋值,那么就会是吧,除非使用 make 分配一个内存空间
- 注意, slice在make的时候可以制定 len, cap长度, len,cap的区别在于: len是当前slice中的element的长度, cap是slice的长度(在自动扩展之后)
- slice在使用的时候最好要区分出数据量的大小是否可以预期,如果是数据量很大,且不确认会有多少的时候,使用append的时候会浪费时间在内存copy了;
- 验证了一下int8在内存的分配
- 0xc000016530 0xc000016531 0xc000016532 0xc000016533 0xc000016534 0xc000016535 0xc000016536 0xc000016537 0xc000016538 0xc000016539 0xc000016528
- 可以看成递增的值为1, 最后一个差距是 16528, 比16530靠前,分配了两个byte.
- 验证了一下int16的内存分配
- 0xc000016540 0xc000016542 0xc000016544 0xc000016546 0xc000016548 0xc00001652a
- 连续的内存分配, int16是分配两个byte。
- 验证了一下int的内存分配
- 验证后知道int与int64一样,是分配8byte的内存地址;
实践过程
go的slice type是构建在Go‘s array type的基础之上。
golang对于slice定义了一组新的格式, 包括比如 []int, [][]int等等 , 这里有几个问题?
- 如何定义slice?
- 如何给slice赋值?
- slice支持的格式类型?
- slice在函数调用的格式?
- int 的内存地址分配大小验证!
给[]int复制
比较简单的方法上对[]int的slice进行append处理
func sint() []int {
var si []int
sii := []int{1,2,3,4}
sii = append(sii, 2)
sii = append(sii, 3)
fmt.
for i := 0; i < 10; i++ {
si = append(si, i)
}
return si
}
如何给[][]int赋值
通过append的方法, 追加的格式需要上 []int的格式;
func ssint() [][]int {
var ssi [][]int
for i := 0; i < 5; i++ {
si := sint()
ssi = append(ssi, si)
}
return ssi
}
slice通过append进行自动扩展的代码
可以看到,最后len打印出来的是6, cap打印出来的是8, 原因是在append(sii,2)的时候进行了一次扩展;
slice在使用的时候最好要区分出数据量的大小是否可以预期,如果是数据量很大,且不确认会有多少的时候,使用append的时候会浪费时间在内存copy了;
sii := []int{1, 2, 3, 4}
sii = append(sii, 2)
sii = append(sii, 3)
fmt.Println(sii, len(sii), cap(sii))
自定义的slice格式
自定义一个selfT的格式,内容为三个串,分别为 Name, Age, No; 以SelfT为基础进行slice扩展
type SelfT struct {
Name string
Age int
No int
}
func sSelfType() {
// var st [2]SelfT
st := make([]SelfT, 2, 5)
st[0] = SelfT{"Pan", 30, 1001}
st[1] = SelfT{"Wan", 31, 1002}
fmt.Println(st)
}
函数调用
slice调用的时候需要传地址,这样就可以在函数内对slice进行操作赋值
func adsi(s *[]int) {
*s = append(*s, 5)
}
验证int8, int16, int的内存分配
通过类似如下的代码,看看变量类型在内存中的分配;
var i8 [10]int8
var i88 int8
for i = 0; i < 10; i++ {
i8[i] = int8(i)
fmt.Printf("%p ", &i8[i])
}
fmt.Printf("%p ", &i88)
以上是关于golang的slice了解及验证的主要内容,如果未能解决你的问题,请参考以下文章