Go

Posted 安然_随心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 := [...]int1, 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方法进行安全的扩充切片。

以上是关于Go的主要内容,如果未能解决你的问题,请参考以下文章

[Go] Go面试题

[Go] Go面试题

[Go] Go面试题

win32 console application是啥意思,有啥用处,工作中啥行业能用到?

再谈 Go Http 服务的优雅重启

Gordon家族