美文网首页
Golang之数组和切片

Golang之数组和切片

作者: 8411e9740257 | 来源:发表于2020-02-27 22:49 被阅读0次

引用

一、数组

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
var e = [...]int{5, 4: 1, 0, 2: 3, 2, 1: 4} // 定义长度为6的int型数组,  元素为 5, 4, 3, 2, 1, 0

Go数组初始化中的 [index:value] 代表的是在索引index处的位置上值为value, 如果索引值越界了就会重置。
数组是值传递。

二、切片

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
    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
)
slice[i:j]
slice[i:j:k]
// 其中 i 表示从 slice 的第几个元素开始切,j 控制切片的长度(j-i),k 控制切片的容量(k-i),如果没有给定 k,则表示切到底层数组的最尾部。

切片是引用传递。

三、迭代

// 索引迭代
for i := range a {
}

// 索引和值迭代
for i,v := rang a {

}

// 值迭代
for _,v := rang a {

}

// 根据长度迭代
for i := 0; i < len(a); i++ {

}

四、底层实现

// reflect/value.go

type SliceHeader struct {
 Data uintptr
 Len int
 Cap int
}

type sliceHeader struct {
  Data unsafe.Pointer
  Len int
  Cap int
}

nil 切片和空切片是不一样的,

var slice []int // nil切片 Data是nil

// 空切片 Data有指向内存地址
silce := make( []int , 0 )
slice := []int{ }

四、转换

// 数组转字符串
func BytesToString(b []byte) string {
    bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
    sh := reflect.StringHeader{bh.Data, bh.Len}
    return *(*string)(unsafe.Pointer(&sh))
}

// 字符串转字节
func StringToBytes(s string) []byte {
    sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
    bh := reflect.SliceHeader{sh.Data, sh.Len, 0}
    return *(*[]byte)(unsafe.Pointer(&bh))
}

相关文章

  • Golang之数组和切片

    引用 数组、字符串和切片 Go数组中的索引问题 深入解析 Go 中 Slice 底层实现 Golang 入门 : ...

  • Golang数组与切片

    Golang数组与切片 数组的声明 Golang中的数组属于静态数组,不允许动态扩展 Golang中数组会默认初始...

  • 简记python的tuple和slice

    python也有类似于golang中数组和切片的概念。python中的数组为tuple(固定的),切片为list(...

  • golang 数组和切片

    数组类型的值(以下简称数组)的长度是固定的,而切片类型的值(以下简称切片)是可变长的。  数组的长度在声明它的时候...

  • Golang 中的数组 (array) 和切片 (slice)

    huangwenwei - 字里行间 | Golang 中的数组 (array) 和切片 (slice) 中文描述...

  • Golang 数组 切片

    Golang 数组和切片 go提供了相应数据类型来存储多个相同类型的元素。它们分别是数组和slice切片。其中,切...

  • Golang数组和切片的区别

    Golang数组和切片的区别 大纲 数组是固定大小 切片不是动态数组,可以扩容 区别 定义方式不一样 初始化方法不...

  • Golang学习心得—切片

    在Golang中有数组和切片两种处理同类型数据序列的方式,但是我们大部分时间都在使用切片,Go的切片是在数组之上的...

  • Golang(四)数组和切片

    数组(Array) 什么是数组 Go 语言提供了数组类型的数据结构。 数组是具有相同唯一类型的一组已编号且长度固定...

  • golang数组append切片添加与删除

    golang数组append切片添加 golang数组删除元素 1.从开头位置删除 2.从中间位置删除 3.从尾部删除

网友评论

      本文标题:Golang之数组和切片

      本文链接:https://www.haomeiwen.com/subject/uhufhhtx.html