GoLang笔记-数组和切片,本质是就是长度不可变的可变的区别

数组 Arrays

数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。当作为方法的入参传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。

初始化

数组的初始化有多种形式,查看示例代码 , 在线运行示例代码

  • [5] int {1,2,3,4,5}
    长度为5的数组,其元素值依次为:1,2,3,4,5
  • [5] int {1,2}

    长度为5的数组,其元素值依次为:1,2,0,0,0 。在初始化时没有指定初值的元素将会赋值为其元素类型int的默认值0,string的默认值是""

  • [...] int {1,2,3,4,5}

    长度为5的数组,其长度是根据初始化时指定的元素个数决定的

  • [5] int { 2:1,3:2,4:3}

    长度为5的数组,key:value,其元素值依次为:0,0,1,2,3。在初始化时指定了2,3,4索引中对应的值:1,2,3

  • [...] int {2:1,4:3}

    长度为5的数组,起元素值依次为:0,0,1,0,3。由于指定了最大索引4对应的值3,根据初始化的元素个数确定其长度为5

赋值与使用

数组通过下标访问元素,可修改其元素值

arr :=[...] int {1,2,3,4,5}
arr[4]=arr[1]+len(arr)      //arr[4]=2+5

通过for遍历数组元素,查看示例代码,在线运行示例代码

arr := [5]int{5, 4, 3}

for index, value := range arr {
    fmt.Printf("arr[%d]=%d \n", index, value)
}

for index := 0; index < len(arr); index++ {
    fmt.Printf("arr[%d]=%d \n", index, arr[index])
}

数组是值类型,将一个数组赋值给另一个数组时将复制一份新的元素,查看示例代码,在线运行示例代码

arr2 := [5]int{1, 2}
arr5 := arr2
arr5[0] = 5
arr2[4] = 2
fmt.Printf(" arr5= %d \n arr2=%d \n arr5[0]==arr2[0]= %s \n", arr5, arr2, arr5[0] == arr2[0])

OutPut:
 arr5=[5 2 0 0 0]
 arr2=[1 2 0 0 2]
 arr5[0]==arr2[0]= false

切片 Slices

数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型Slices切片,与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。切片中有两个概念:一是len长度,二是cap容量,长度是指已经被赋过值的最大下标+1,可通过内置函数len()获得。容量是指切片目前可容纳的最多元素个数,可通过内置函数cap()获得。切片是引用类型,因此在当传递切片时将引用同一指针,修改值将会影响其他的对象。

初始化

切片可以通过数组来初始化,也可以通过内置函数make()初始化 .初始化时len=cap,在追加元素时如果容量cap不足时将按len的2倍扩容 查看示例代码在线运行示例代码

  • s :=[] int {1,2,3 }
    直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3
  • s := arr[:]

    初始化切片s,是数组arr的引用

  • s := arr[startIndex:endIndex]

    将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片

  • s := arr[startIndex:]

    缺省endIndex时将表示一直到arr的最后一个元素

  • s := arr[:endIndex]

    缺省startIndex时将表示从arr的第一个元素开始

  • s1 := s[startIndex:endIndex]

    通过切片s初始化切片s1

  • s :=make([]int,len,cap)

    通过内置函数make()初始化切片s,[]int 标识为其元素类型为int的切片

赋值与使用

切片是引用类型,在使用时需要注意其操作。查看示例代码在线运行示例代码
切片可以通过内置函数append(slice []Type,elems ...Type)追加元素,elems可以是一排type类型的数据,也可以是slice,因为追加的一个一个的元素,因此如果将一个slice追加到另一个slice中需要带上"...",这样才能表示是将slice中的元素依次追加到另一个slice中。另外在通过下标访问元素时下标不能超过len大小,如同数组的下标不能超出len范围一样。

  • s :=append(s,1,2,3,4)
  • s :=append(s,s1...)

转自:http://www.cnblogs.com/howDo/archive/2013/04/25/GoLang-Array-Slice.html

时间: 2024-10-12 14:24:52

GoLang笔记-数组和切片,本质是就是长度不可变的可变的区别的相关文章

golang中数组与切片的区别

初始化:数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变 数组: a := [...]int{1,2,3} a := [3]int{1,2,3} 切片: a:= []int{1,2,3} a := make([]int, 5) a := make([]int, 5, 10) 函数传递:数组需要明确指定大小,切片不需要.数组是值传递,切片是地址传递 numbers2 := [...]int{1, 2, 3, 4, 5, 6} maxIndex2 := len(numbers2) -

Golang理解-数组和切片

数组 数组在Go中定义及特点 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成. 因为数组的长度是固定的,因此在Go语言中很少直接使用数组. 和数组对应的类型是Slice(切片),它是可以增长和收缩动态序列,slice功能也更灵活,但是要理解slice工作原理的话需要先理解数组. 默认情况下,数组的每个元素都被初始化为元素类型对应的零值,对于数字类型来说就是0.我们也可以使用数组字面值语法用一组值来初始化数组: var q [3]int = [3]int{1, 2,

C++-Golang的数组类型异同

1. 本文章的必要性 C++的存在像一把瑞士军刀,继承了C语言的设计理念--"充分相信程序员",几乎将所有的底层细节都暴露在外,程序员可以自由控制.在最近详细学习Golang的过程中,发现Golang中的常用结构的设计理念与C++截然不同,为许多常用的操作都提供了语言设计者所认为的"最佳实践".本文章仅讨论Golang中数组和切片. 2. Golang数组 和 C++数组(Array) 例子 C++ version // const常量长度初始化 // 显然非常量无

GO语言总结(3)——数组和切片

上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式:[length]Type .[N]Type{value1, value2, ... , valueN}.[...]Type{value1, value2, ... , valueN} 如下: func test5() { var iarray1 [5]int32

go语言数组与切片比较

一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式:[length]Type .[N]Type{value1, value2, ... , valueN}.[...]Type{value1, value2, ... , valueN} 如下: 复制代码 代码如下: func test5() {    var iarray1 [5]int32    var iarray2 [5]int32 = [5]int32{1, 2, 3,

学习Golang语言(6):类型--切片

学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Golang语言(5):类型--数组 学习Golang语言(6):类型--切片 在很多应用场景中,数组不能够满足我们的需求.在初始定义数组时,我们并不知道数组所需的长度.因此,我们需要一个大小可以动态变化的数组(动态数组) 在Go语言中,这种"动态数组"成为slice(切片). 但是实际上slic

Golang 笔记 1

一.Go语言基础 1. 基础 Go语言中的标识符必须以字母(Unicode字母,PHP/JS可以用中文作为变量名)下划线开头.大写字母跟小写字母是不同的:Hello和hello是两个不同的名字.  Go中有25个关键字: break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for imp

Go - 数组 和 切片

一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建 数组有 3 种创建方式: 1) [length]Type 2) [length]Type{value1, value2, ... , valueN} 3) [...]Type{value1, value2, ... , valueN} 如下: func test5() { var arr1 [5]int32 var arr2 [5]int32 = [5]int32{1, 2, 3, 4, 5} a

Go数组、切片、映射的原理--简明解析

数组.切片.映射是Golang的最重要的数据结构,下面是对这3种数据结构的一点个人总结: 一.数组 数组是切片和映射的基础数据结构. 数组是一个长度固定的数据类型,存储着一段具有相同数据类型元素的连续内存块. 因为数组占用的内存是连续分配的,所以对数组的操作速度很快. 声明数组的方式:4种 var array1 [5]int array1 := [5]int{3,5,6,3,2} array1 := [...]int{3,4,7,8,1} //根据数组字面量中元素的个数来确定数组的长度 arra