go语言切片slice,切片声明的五种方法,包括new()和make()的方法

声明切片slice的一般方式

var s []type

这是定义切片slice的一般形式,将这个定义式与数组array的定义式“ var arr [n]type”进行一番比较,可以看出,这其中就差了一个长度n,也就是说slice是没有长度限制的,这也是切片被称为“动态数组”的原因,正是因为这项优势,go语言编程当中,相比于长度固定不变的数组array,切片slice更经常被使用。


切片slice声明实例

package main

import (
	"fmt"
	"reflect"
)

func main() {

	var s0 []int //声明一个int类型的切片,未初始化,go会默认对其进行赋值
	fmt.Println(reflect.TypeOf(s0), s0) //reflect.TypeOf()函数跟下面的%T,都可以返回数据的类型
	var s1 []int = []int{1, 2, 3} //声明一个int类型的切片,并初始化
	fmt.Println(reflect.TypeOf(s1), s1)
	s2 := []string{"x1y1z1.com", "大器编程"}
	fmt.Printf("s2的类型为%T,值为%v", s2, s2)

}
——————————————————————————————
代码输出:
[]int [] //由此可见,未初始化的切片,go会默认赋为空值
[]int [1 2 3]
s2的类型为[]string,值为[x1y1z1.com 大器编程]

切片slice和数组array的关系

  • 切片slice的底层是对数组array的引用;
  • 切片可以引用数组的部分元素或者全部元素;
  • 切片slice的指针指向的是切片的第一个元素的内存地址,也就是该元素对应的数组的元素的内存地址。

切片slice引用数组array,切片声明的第二种形式

声明切片slice的另一种方式,就是通过对数组array的引用,方式为array[ start : end ],其中start最小值为0,可以不写,默认值为0,end的最大值为切片slice的容量cap,默认值也是这个。除此之外,切片的引用方式是[ start, end )半闭区间的模式,即索引start可以引用到,而end是不能引用到的。如下面的实例:

package main

import "fmt"

func main() {

	var arr [5]int = [5]int{1, 2, 3, 4, 5}
	var s0 []int = arr[0:2] //索引index从0开始,表示第一位
	fmt.Printf("s0的类型为%T,值为%v\n", s0, s0)
	s1 := arr[:] //start和end不写的话,则默认start为0,end为数组索引的最大值,即切片会引用整个数组的元素
	fmt.Printf("s1的类型为%T,值为%v\n", s1, s1)
	s2 := s1[:2][:] //切片本身也可以被另一个切片引用,而且可以多重引用
	fmt.Printf("s2的类型为%T,值为%v\n", s2, s2)

}
————————————————————————————————
代码输出:
s0的类型为[]int,值为[1 2]
s1的类型为[]int,值为[1 2 3 4 5]
s2的类型为[]int,值为[1 2]

代码解析

如上代码,切片s0引用的是数组arr[0:2],其中end的值为2,即索引为2,指向的是arr数组中的第三个元素,为3,因为切片引用的模式采用的是[ start , end )半闭区间的模式,所以3并没有被引用到。其他的解析可以看上面的注释。


切片声明的第三种形式

切片声明的第三种形式,就是对切片的引用,如上例中的s2便是通过对切片的引用而声明创建的。


用new()方法创建指针类型的切片

	var s *[]int = new([]int)
	fmt.Printf("s的数据类型为%T,值为%v", s, s)
——————————————————————————————
代码输出:
s的数据类型为*[]int,值为&[]

代码解析

*表示指针,&是引用符号。


用make()函数创建切片

make()创建切片的同时,用0值进行初始化,其函数的语法如下:

make( [ ]T, len, cap );其中[ ]T为切片类型,len为切片长度,cap为切片容量,cap可省略,默认情况下与长度len相等。

	var s []int = make([]int, 5)
	fmt.Printf("s的数据类型为%T,值为%v", s, s)
——————————————————————————————
代码输出:
s的数据类型为[]int,值为[0 0 0 0 0]

全栈后端 / go语法 :













Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.