go的切片与数组,切片创建、初始化、追加、扩容、截取

var array [5]int
var array =[5]int{1001,1002,1003,1004,1005}
var array =[...]int{1001,1002,1003,1004,1005}
array:=[5]int{1,2,3,4,5}
以上定义出来的是数组

var slice []int
var slice []int = array[1:3]
var slice = []int{1,2,3}
slice := make([]int,3,5)
以上定义出来的是切片

1,定义的时候设置了长度,就是数组;未设置长度,就是切片。
2,截取操作返回的是切片;切片长度是截取的长度;切片容量是从截取位置开始一直到原数组或切片结束。
3,切片扩容超过原容量后,会重新创建一个底层数组,与原数组再无关联。

 

 

package main

import (
	"fmt"
	"reflect"
)

func main() {
	//fmt.Println(test())
	//test()
	//testMap()
	//testSlice()
	testSlice2()
}

func test() (i int) {

	defer func() { i++ }()
	defer func() { fmt.Println(i) }()

	//todo
	//...

	fmt.Println(0)
	return 1
	//defer执行时机
}

func testMap() (i int) {
	var a map[string] int
	a = make(map[string] int)

	//var a = map[string] int{}

	a["aaa"] = 1
	fmt.Println(a)
	i = a["aaa"]
	fmt.Println(i)
	return i
}

func testSlice() (i int) {
	var a [] int
	//a = make([]int,2)

	a = []int{0}

	a[0] = 2
	fmt.Println(a)
	i = a[0]
	fmt.Println(i)
	return i
}

func testSlice2() {
	var array = [...]int{1001,1002,1003,1004,1005} //数组
	var slice = array[1:3] //切片
	fmt.Println(array,"、长度:",len(array),"、容量:",cap(array))
	fmt.Println(slice,"、长度:",len(slice),"、容量:",cap(slice))
	fmt.Println()
	for i:=range slice{
		slice[i]+=100
	}
	fmt.Println(array,"、长度:",len(array),"、容量:",cap(array))
	fmt.Println(slice,"、长度:",len(slice),"、容量:",cap(slice))
	fmt.Println()
	slice = append(slice, 1006)
	fmt.Println(array,"、长度:",len(array),"、容量:",cap(array))
	fmt.Println(slice,"、长度:",len(slice),"、容量:",cap(slice))
	fmt.Println()
	slice = append(slice, 1007,1008,1009,1010) //切片扩容超过原容量后,会重新创建并指向一个新的底层数组
	fmt.Println(array,"、长度:",len(array),"、容量:",cap(array))
	fmt.Println(slice,"、长度:",len(slice),"、容量:",cap(slice))
	fmt.Println()
	slice = append(slice, 1011,1012,1013)
	fmt.Println(slice,"、长度:",len(slice),"、容量:",cap(slice))
	fmt.Println()
	fmt.Println(reflect.TypeOf(array))
	fmt.Println(reflect.TypeOf(slice))
}



输出:

[1001 1002 1003 1004 1005] 、长度: 5 、容量: 5
[0 0 0] 、长度: 3 、容量: 5

[1001 1002 1003 1004 1005] 、长度: 5 、容量: 5
[100 100 100] 、长度: 3 、容量: 5

[1001 1002 1003 1004 1005] 、长度: 5 、容量: 5
[100 100 100 1006] 、长度: 4 、容量: 5

[1001 1002 1003 1004 1005] 、长度: 5 、容量: 5
[100 100 100 1006 1007 1008 1009 1010] 、长度: 8 、容量: 10  //切片扩容超过原容量后,会重新创建一个底层数组,与原数组再无关联。容量翻倍

[100 100 100 1006 1007 1008 1009 1010 1011 1012 1013] 、长度: 11 、容量: 20 //追加超过容量,容量翻倍

[5]int //有长度,是数组
[]int //无长度,是切片

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值