Go

参考地址:
https://blog.golang.org/slices
https://blog.golang.org/strings

1. Go中的 数组,切片

先看结论:

1.1 关于数组

  • 对于数组来说,size 是类型的一部分。如下所示,buffer1 与buffer2 就是不同的类型。
buffer1 [256]byte,
buffer2[512]byte 。
  • 在存储时,buffer1中就只存储了他的元素值(没有其他的数据,简单的数组)。存储示意如下所示。可以通过索引方式进行访问,如 buffer1[1], buffer1[2]…
buffer1 : byte byte byte ... 256 times ... byte byte byte
  • 数组在Go中最重要的用处就是作为slice 的底层存储;另外,对于多维矩阵,使用数组比较方便;

1.2 关于切片

  • 切片是一种 数据结构,用于描述 一个底层数据的连续的数据区域。切片不是数组,只是 用于描述数组的一部分。使用上述的buffer1数据来说,构建切片的方式包括:
var slice []byte = buffer[100:150] //前闭后开
  • 切片元素的类型和底层数组元素类型一致,因此,构造时,可以省略类型声明,如下:
var slice = buffer[100:150]
或:
slice := buffer[100:150]
  • slice变量的底层数据结构的样子是什么呢?可以将它想象为入下的样子(真实的样子还这有点区别)
type sliceHeader struct {
    Length        int
    Capacity      int
    ZerothElement *byte  //实际的ZerothElement的类型和  切片元素的类型一致
}

slice := sliceHeader{
    Length:        50,
    ZerothElement: &buffer[100],
}
  • 另外,也可以从切片中构建切片
slice2 := slice[5:10]

上面的slice2 从slice的slice[5]开始,也就是从buffer的buffer[105]开始,109结束。两个切片同时指向同一个底层数组。

  • 切片本身是一个值类型,但是内部包含了一个指针,通过指针引用操作底层数组。当使用slice作为参数传递时,传值方式为值传递,即形参是实参的一个拷贝。虽然切片是一个值类型,但是使用切片作为参数,还是可以修改到底层数组的值(在不发生扩容的情况下)

It’s important to understand that even though a slice contains a pointer, it is itself a value. Under the covers, it is a struct value holding a pointer and a length. It is not a pointer to a struct.

package main

import (
	"fmt"
)

func AddOneToEachElement(slice []int) {
	for i := range slice {
		slice[i]++
	}
}

func SubtractOneFromLength(slice []int) []int {
	slice = slice[0 : len(slice)-1]
	return slice
}

func main() {

	data := [...]int{1, 2, 3, 4, 5}
	slice := data[:]
	AddOneToEachElement(slice)

	fmt.Println("%s", slice)
	fmt.Println("%s", data)

	fmt.Println("Before: len(slice) =", len(slice))
	newSlice := SubtractOneFromLength(slice)
	fmt.Println("After:  len(slice) =", len(slice))
	fmt.Println("After:  len(newSlice) =", len(newSlice))

}

输出:

%s [2 3 4 5 6]
%s [2 3 4 5 6]
Before: len(slice) = 5
After:  len(slice) = 5
After:  len(newSlice) = 4
  • 切片的容量等于底层数组的大小。但你将slice的扩大时,最大不能操作底层数组的大小。当index>cap容量时,会导致pannic。如果你想要扩大slice到超出底层数组时,应该怎么做?实际上没有任务办法。你唯一可以做的时,重新申请一个数组,然后把当前内容复制过去。
  • make 方法:帮助你快速的创建一个切片。功能:创建一个底层数组,并使用该底层数组,构建切片。
  • 使用append方法进行安全的扩充切片。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值