Go语言学习笔记-07数组与切片

月之骑士
• 阅读 801

Go语言学习笔记-07数组与切片

数组

Go语言中的数组是一个长度固定,由相同类型的元素组成

声明

只声明,不初始化,默认为数据类型的零值

var arr [个数]数据类型

声明并初始化

var arr [5]int = [5]int{} // [0,0,0,0,0]
var arr [5]int = [5]{1,2,3,4,5} // [1,2,3,4,5]

为某些位置设置值,其余保持为0

var arr [5]int = [5]int{3:9} // [0,1,3,9,0] 为第4个元素设置值,其余保持为0

使用...自动设置元素个数

var arr = [...]{1,2,3,4,5}

使用...设置稀疏数组

var arr = [...]{49:50} // 设置第50个元素值为50,其余的为0

多维数组声明

var arr [2][3]int // 声明了一个2行3列的数组

可以拆开来看,看作2个[3]int

多为数组初始化

// 第2维以后的类型申明可写可不写
var arr = [2][3]int{[3]int{1,2,3},[3]int{4,5,6}}
var arr = [2][3]int{{1,2,3},{4,5,6}}

ch07/main.go

package main

import "fmt"

func main() {
    // 声明不初始化,默认为数据类型的零值
    var arr1 [5]int
    fmt.Println("arr1", arr1)

    // 声明并初始化
    var arr2 [5]int = [5]int{1, 2, 3, 4, 5}
    fmt.Println("arr2", arr2)

    // 为某些位置设置值,其余保持为0
    var arr3 [5]int = [5]int{3: 9}
    fmt.Println("arr4", arr3)

    // 使用...自动设置元素个数
    var arr4 = [...]int{4: 5}
    fmt.Println("arr4", arr4)

    // 多维数组
    var arr5 = [2][3]int{[3]int{1, 2, 3}, {4, 5, 6}}
    fmt.Println("arr5", arr5)
}

输出

arr1 [0 0 0 0 0]
arr2 [1 2 3 4 5]      
arr4 [0 0 0 9 0]      
arr4 [0 0 0 0 5]      
arr5 [[1 2 3] [4 5 6]]

获取数组的长度

使用内置函数len获取

package main

import "fmt"

func main() {
    var arr = [5]int{}
    fmt.Printf("arr的长度为%d", len(arr))
}

输出

arr的长度为5

读取数组的值

使用下标获取数组的值,下标从0开始,不支持负数获取

package main

import "fmt"

func main() {
    var arr = [5]int{1, 2, 3, 4, 5}

    fmt.Printf("arr[1]=%d", arr[1])
}

切片

切片与数组很相像,只是它的长度不是固定的,随着元素的增多动态地变化

切片在go中的底层实现,是由一个指向底层数组的指针,切片的长度(切片元素的个位)以及底层数组的长度(切片的最大容量)三部分组成

可以通过内置函数len获取切片长度,通过内置函数cap获取切片容量

ch07/lenandcap/main.go

package main

import "fmt"

func main() {
    var slice = []int{1, 2, 3, 4, 5}
    fmt.Printf("slice 的长度为:%d,容量为:%d", len(slice), cap(slice))
}

输出

slice 的长度为:5,容量为:5

声明

var slice []数据类型

声明并初始化,长度和容量相等

var slice = []int{1,2,3,4,5} // [1,2,3,4,5] len=5 cap=5

只声明不初始化,长度和容量都为0,切片的默认值为nil

var slice []int // []int(nil) len=0 cap=0

ch07/sliceinit/main.go

package main

import "fmt"

func main() {
    var slice1 = []int{1, 2, 3, 4, 5}
    var slice2 []int
    fmt.Printf("slice1 %v 长度为:%d,容量为:%d\n", slice1, len(slice1), cap(slice1))
    fmt.Printf("slice2 %#v 长度为:%d,容量为:%d\n", slice2, len(slice2), cap(slice2))
}

输出

slice1 [1 2 3 4 5] 长度为:5,容量为:5
slice2 []int(nil) 长度为:0,容量为:0

通过make函数创建切片

var slice = make([]数据类型,长度,容量)

ch07/makeslice/main.go

package main

import "fmt"

func main() {
    slice := make([]int, 5)
    slice2 := make([]int, 5, 10)

    fmt.Printf("slice %v 长度:%d,容量:%d\n", slice, len(slice), cap(slice))
    fmt.Printf("slice2 %v 长度:%d,容量:%d\n", slice2, len(slice2), cap(slice2))
}

输出

slice [0 0 0 0 0] 长度:5,容量:5
slice2 [0 0 0 0 0] 长度:5,容量:10

通过数组创建切片

可以通过array[low:high:max]形式从一个数组中获取到一个切片,此时切片起始元素是数组下标为low的元素,切片的长度为high-low,切片的容量为max-low,切片的底层数组就是就是array,换言之,修改切片的值,array同样也会受到影响

array[low:high]max省略时,max的默认值为数组的长度

array[:]可以得到一个和arr元素一样的切片

ch07/arraytoslice/main.go

package main

import "fmt"

func main() {
    arr := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    slice1 := arr[2:7:8] // [2,3,4,5,6]
    slice2 := arr[:]     // [1,2,3,4,5,6,7,8,9,10]
    slice3 := arr[3:4]   // [4]

    fmt.Printf("slice1 %v,长度:%d,容量:%d\n", slice1, len(slice1), cap(slice1))
    fmt.Printf("slice2 %v,长度:%d,容量:%d\n", slice2, len(slice2), cap(slice2))
    fmt.Printf("slice3 %v,长度:%d,容量:%d\n", slice3, len(slice3), cap(slice3))

    // 修改切片的第4个元素,及把6改为12
    slice1[3] = 12

    // 原数组arr发生改变
    fmt.Printf("修改后slice1 %v,长度:%d,容量:%d\n", slice1, len(slice1), cap(slice1))
    fmt.Printf("修改后slice2 %v,长度:%d,容量:%d\n", slice2, len(slice2), cap(slice2))
    fmt.Printf("修改后arr %v\n", arr)

}

输出

slice1 [3 4 5 6 7],长度:5,容量:6
slice2 [1 2 3 4 5 6 7 8 9 10],长度:10,容量:10       
slice3 [4],长度:1,容量:7                            
修改后slice1 [3 4 5 12 7],长度:5,容量:6             
修改后slice2 [1 2 3 4 5 12 7 8 9 10],长度:10,容量:10
修改后arr [1 2 3 4 5 12 7 8 9 10]       

笔记地址

github:https://github.com/xianyuyixi...

交流学习

微信号:xianyuyixia

Go语言学习笔记-07数组与切片

微信公众号:闲渔一下

Go语言学习笔记-07数组与切片

点赞
收藏
评论区
推荐文章
九路 九路
4年前
一篇文章彻底弄懂go语言方法的本质
Go语言不支持经典的面向对象语法元素,比如:类、对象、继承等。但Go语言也有方法(method)。和函数相比,Go语言中的方法在声明形式上仅仅多了一个参数,Go称之为receiver参数。而receiver参数正是方法与类型之间的纽带。Go方法的一般声明形式如下:gofunc(receiverT/T)MethodName(参数列表)
九路 九路
4年前
一篇文章彻底弄懂理解和高效运用切片(slice)
slice,中文多译为“切片”,是Go语言在数组之上提供的一个重要的抽象数据类型。在Go语言中,绝大多数需要使用数组的场合,切片都实现了完美替代。并且和数组相比,切片提供了更通用、功能更强大且便捷的数据序列访问接口。1.切片究竟是什么在对切片一探究竟之前,我们先来简略了解一下Go语言中的数组。Go语言数组是一个固定长度的、容纳同构类型元素的
go语言中,数组与切片的区别?
切片是Go语言核心的数据结构,然而刚接触Go的程序员经常在切片的工作方式和行为表现上被绊倒。比如,明明说切片是引用类型但在函数内对其做的更改有时候却保留不下来,有时候却可以。究其原因是因为我们很多人用其他语言的思维来尝试猜测Go语言中切片的行为,切片这个内置类型在Go语言底层有其单独的类型定义,而不是我们通常理解的其他语言中数组的概念。文章
Wesley13 Wesley13
3年前
Go 定长的数组
1.Go语言数组的简介  几乎所有的计算机语言都有数组,应用非常的广泛。同样,在Go语言中也有数组并且在数组的基础上还衍生出了切片(slice)。数组是一系列同一类型数据的集合,数组中包含的每个数据被称为数组元素,一个数组包含的元素个数被称为数组的长度,这是数组的基本定义。  在Go语言中数组是一个值类型(ValueType)
Wesley13 Wesley13
3年前
JAVA 基础3
一.数组的概念数组可以看成是多个数据类型的集合,是对这些数据进行统一的管理;数组的变量是引用类型,数组本身是对象,数组中的每个元素相当于该对象的成员变量;数组的元素可以是任何数据类型,包括基础数据类型和引用类型;二.数组的声明方式数据类型\\数组名称new数据类型
Wesley13 Wesley13
3年前
Go 语言初级教程之六[基本类型]
基本类型像C语言一样,Go提供了一系列的基本类型,常见的布尔,整数和浮点数类型都具备。它有一个Unicode的字符串类型和数组类型。同时该语言还引入了两种新的类型:slice和map。数组和切片Go语言当中的数组不是像C语言那样动态的。它们的大小是类型的一部分,在编译时就决定了。数组的索引还是使用的熟悉的
Wesley13 Wesley13
3年前
C语言自学《五》
什么是数组数组是一组数目固定、类型相同的数据项数组中的数据称为元素比如longnumbers\10\;方括号中的数字定义了要存放在数组中的元素个数,称为数组维度数组有一个类型,它组合了元素的类型和数组中的元素个数,因此如果两个数组的元素个数、类型相同,这两个数组的类型就相同可以在数组名称后的方括号内使用索引值,索引值是从0开始
Wesley13 Wesley13
3年前
Java基础之数组队列及Java堆外内存学习笔记[图]
Java基础之数组队列及Java堆外内存学习笔记\图\1.数组1.1数组基本概念:数组是一个容器,可以存储同一数据类型的N个数据;数组是一个数据结构,是数据结构中访问速度最快的;数组是直接通过下标进行定位;数组是属于引用数据类型(数组名中存储的是内存首地址);数组本身只有有length属性(获取数组能存储的数据个数),但是
小万哥 小万哥
1年前
Go 语言中结构体的使用和示例
结构体(简称struct)用于创建不同数据类型的成员集合,放入一个单一的变量中。虽然数组用于将相同数据类型的多个值存储在单一变量中,但结构体用于将不同数据类型的多个值存储在单一变量中。结构体对于将数据组合在一起以创建记录非常有用。声明结构体要在Go中声明一
小万哥 小万哥
1年前
NumPy 数组切片及数据类型介绍
NumPy数组切片NumPy数组切片用于从数组中提取子集。它类似于Python中的列表切片,但支持多维数组。一维数组切片要从一维数组中提取子集,可以使用方括号并指定切片。切片由起始索引、结束索引和可选步长组成,用冒号:分隔。语法:pythonarrs
IT全栈视野 IT全栈视野
1年前
Go开发者成长之路
在Go语言中,成长路径可以包括以下几个阶段:1.安装和配置Go环境:访问Go官网下载并安装Go语言。设置环境变量GOPATH和确保PATH包含Go二进制文件路径。2.学习基础语法:包括变量、函数、控制流、指针、结构体、数组、切片、映射等。3.学习并发编程:
月之骑士
月之骑士
Lv1
如果未曾深入过对方的生活,就别妄想真的了解对方. 经典个性签名大全。
文章
3
粉丝
0
获赞
0