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)

原文地址:https://www.cnblogs.com/gpan/p/9912304.html

时间: 2024-07-31 19:32:16

golang的slice了解及验证的相关文章

golang的slice作为函数参数传值的坑

直接贴代码 func sliceModify(slice []int) { // slice[0] = 88 slice = append(slice, 6) } func main() { slice := []int{1, 2, 3, 4, 5} sliceModify(slice) fmt.Println(slice) } 返回的没变,坑爹的,这个设计太那啥了,可以正确跑出效果的版本如下: func sliceModify(slice *[]int) { *slice = append(*

Golang:slice之append时原数组发生变化的问题

使用append可以在slice之后追求元素,例如 nums:=[]int{1,2,3} result:=append(nums,4) fmt.Println(result) 这段代码很简单,输出result的值为:[1 2 3 4] 问题在于,进行这种操作时,原来的slice(即nums)所基于的数组的值会不会发生变化呢?在Golang中,如果有多个slice基于了同一个数组,则这些slice的数据是共享的(而不是每个slice复制一份).也就说,如果改变了数组的内容,则基于它的所有slice

golang array, slice, string笔记

本来想写一篇关于golang io的笔记,但是在学习io之前必须了解array, slice, string概念,因此将在下篇写golang io. array: 数组的长度是该数组类型的一部分,例如var buffer [256]byte 的类型是[256]byte, len(buffer)总是返回256. slice: 一个slice描述一个数组中连续的一部分,例如var slice = buffer[100:250].slice也可以从slice产生,如var slice2 = slice

golang 之 slice

Slice types A slice is a descriptor for a contiguous segment of an underlying array and provides access to a numbered sequence of elements from that array. A slice type denotes the set of all slices of arrays of its element type. The value of an unin

Golang Clearing slice

//first method : slice = nil // second method : slice = slice[0:0] Source page : https://www.socketloop.com/tutorials/golang-clearing-slice

golang切片slice

切片slice是引用类型 len()函数获取元素的个数 cap()获取数组的容量 1.申明方式 (1)var a []int 与数组不同的是他不申明长度(2)s2 := make([]int, 3, 10) //元素的类型,元素的数量,元素的容量  fmt.Println(len(s2), cap(s2)) 输出元素的数量和容量 2.讲数组转换成切片 2 a := [10]int{} 3 fmt.Println(a) 4 s1 := a[:10] //取前10个元素 [5:]取 5-最后的元素

使用golang的slice来模拟栈

slice(切片):底层数据结构是数组 stack(栈):一种先进后出的数据结构 普通版的模拟写入和读取的栈 package main import "fmt" //栈的特点是先进后出 //使用一个切片的全局变量来模拟栈 var stack []int //向栈中添加数据 func push(value int) { stack = append(stack, value) } //从栈中获取数据 func pop() (int, bool) { ok := false value :

golang中slice处理遇到的一个关于引用的坑

前两天在解扫地机器人算法的问题时,遇到一个坑 部分代码如下: func move2(startPoint Point) [][]Point { allFootPrint := [][]Point{{startPoint}} for i := 0; i < N; i++ { allNewFootPrint := make([][]Point, 0) for len(allFootPrint) > 0 { curFootPrint := allFootPrint[len(allFootPrint)

Golang常见误区(二)

35. 关闭 HTTP 的响应体 使用 HTTP 标准库发起请求.获取响应时,即使你不从响应中读取任何数据或响应为空,都需要手动关闭响应体.新手很容易忘记手动关闭,或者写在了错误的位置: // 请求失败造成 panic func main() { resp, err := http.Get("https://api.ipify.org?format=json") defer resp.Body.Close()    // resp 可能为 nil,不能读取 Body if err !=