[Golang]slice介绍与心智图

slice与array的差异。

  1. 类型的差异
    array属於值类型,同属於值类型的包含,基础数据类型、结构体类型。
    slice属於引用类型,而同属於引用类型的包含,字典、通道、函数类型。

  2. 宣告方式
    从下面的范例看,宣告方式的差异。

package main

import "fmt"

func main() {
  //array 宣告, string 类型
  a := [5]string{"A","B","C","D","E"}
  fmt.Printf("The value of a: %s\n\n", a)

  //slice 宣告, 不指名容量, 容量就跟长度相同
  s1 := make([]int, 5)
  fmt.Printf("The length of s1: %d\n", len(s1))
  fmt.Printf("The capacity of s1: %d\n", cap(s1))
  fmt.Printf("The value of s1: %d\n\n", s1)

  //slice 宣告, 用len、cap可以取得slice的length、capacity
  s2 := make([]int, 5, 5)
  fmt.Printf("The length of s2: %d\n", len(s2))
  fmt.Printf("The capacity of s2: %d\n", cap(s2))
  fmt.Printf("The value of s2: %d\n\n", s2)
}

https://play.golang.org/p/KWEYeVjvQML

array在宣告时,就确定长度。

a := [5]string{"A","B","C","D","E"}

slice 包含三个部分,pointer、length、capacity。
借用网路上的图片,来说明slice的结构。
可以把slice看做对array的ㄧ层简单的封装。
https://ithelp.ithome.com.tw/upload/images/20201026/20131728eJ0YxiCqDo.png

s2 := make([]int, 5, 5)

解读上面的宣告,宣告一个 slice,pointer 指向一个int array,而这个int array的长度和容量都是5。

s2 := make([]int, 5, 8)

更改成这个宣告的话,宣告一个 slice,pointer 指向一个int array,而这个int array的长度是5,容量是8。

  1. 添加元素到slice中
package main

import "fmt"

func main() {
  s1 := make([]int, 0)
  fmt.Printf("The capacity of s1: %d\n", cap(s1))
  for i := 1; i <= 5; i++ {
    s1 = append(s1, i)
    fmt.Printf("s1(%d): len: %d, cap: %d\n", i, len(s1), cap(s1))
  }
  fmt.Println()
}

https://play.golang.org/p/KlzlLlMkbj2

使用append的函数,把元素丢到slice s1中。
当容量为零时,append会新增一个容量。
当容量不够时,append会以2的倍数增加slice的容量。

小总结:
array在宣告的时候,就确定长度,且长度固定。
slice的长度,可以随着元素的数量增加而增长。

https://ithelp.ithome.com.tw/upload/images/20201026/2013172877zzusuCCK.png

引用:

https://hsinyu.gitbooks.io/golang_note/content/slice.html


<<:  码农最後的微检讨,拖了整整十天的完赛心得

>>:  第 52 篇 - 研究 shell 解释器 - 居然可以支援 function

[Day11] C#实作解密Response讯息内文(Message)

昨天我们利用service把计算sign的逻辑串接起来,今天继续来试试看,要如何取得永丰Api的re...

Day 18 — To Do List (5) 新增 To Do Event

昨天我们快乐 (?) 的把资料 render 到网页上(虽然会有点 Delay,对 UX 不好…不过...

[第七天]从0开始的UnityAR手机游戏开发-介绍Unity的Asset Store和从Asset Store或网路下载3D模型

介绍Unity资源商店 先开启Asset Store,将Assets Store拖曳出来 对着As...

从零开始学3D游戏设计:入门程序实作 Part.4 冷却时间确认(debouncing)

这是 Roblox 从零开始系列,入门章节的第十个单元,在这个单元你将学会如何去为陷阱加上执行确认,...

DAY 26 制作表格-生成表格

上篇加入了支持中文的字体,这边使用matplotlib.pyplot与资料库资料生成表格 生成表格 ...