go slice 使用

  • 2022-07-09
  • 浏览 (1141)

golang slice 使用样例

package main

import (
	"fmt"
	"testing"
	"unsafe"
)

/*
Go 语言切片是对数组的抽象。

Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,
Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),
与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

你可以声明一个未指定大小的数组来定义切片:
var identifier []type

切片不需要说明长度。

或使用make()函数来创建切片:

var slice1 []type = make([]type, len)

也可以简写为

slice1 := make([]type, len)

也可以指定容量,其中capacity为可选参数。

make([]T, length, capacity)

这里 len 是数组的长度并且也是切片的初始长度。
*/

func TestSlice0(t *testing.T) {
	p := []int{2, 3, 5, 7, 11, 13}
	fmt.Println("p ==", p)
	fmt.Println("p[1:4] ==", p[1:4])

	// 省略下标代表从 0 开始
	fmt.Println("p[:3] ==", p[:3])

	// 省略上标代表到 len(s) 结束
	fmt.Println("p[4:] ==", p[4:])
}

func TestSlice1(t *testing.T) {
	var a []int
	printSlice("a", a)

	// append works on nil slices.
	a = append(a, 0)
	printSlice("a", a)

	// the slice grows as needed.
	a = append(a, 1)
	printSlice("a", a)

	// we can add more than one element at a time.
	a = append(a, 2, 3, 4)
	printSlice("a", a)
}

func TestSlice3(t *testing.T) {
	var balance0 = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0} //数组
	balance0[0] = 100.0
	balance1 := balance0[:] //切片,是数组balance0的引用
	balance1[0] = 101.0
	var balance2 = []float32{1000.0, 2.0, 3.4, 7.0, 50.0} //切片
	balance2[0] = 102.0
	fmt.Println(balance0, "\n", balance1, "\n", balance2)
}

func printSlice(s string, x []int) {
	fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x)
}

func TestSliceAndArray(t *testing.T) {
	a := [...]int{1, 2, 3, 4, 5, 6}
	fmt.Println("star deal array, orginal data is:")
	fmt.Println(a)
	aMaxIndex := len(a) - 1
	fmt.Printf("aMaxIndex:%d\r", aMaxIndex)
	for i, e := range a {
		if i == aMaxIndex {
			a[0] += e
			fmt.Printf("index is 0, val is :%d\r", a[0])
		} else {
			a[i+1] += e
			fmt.Printf("index is:%d ,val is :%d\r", i+1, a[i+1])
		}
	}
	fmt.Println("deal result is:")
	fmt.Println(a)

	s := []int{1, 2, 3, 4, 5, 6}
	fmt.Println("star deal slice, orginal data is:")
	fmt.Println(s)
	sMaxIndex := len(s) - 1
	fmt.Printf("aMaxIndex:%d\r", sMaxIndex)
	for i, e := range s {
		if i == sMaxIndex {
			s[0] += e
			fmt.Printf("index is 0, val is :%d\r", s[0])
		} else {
			s[i+1] += e
			fmt.Printf("index is:%d ,val is :%d\r", i+1, s[i+1])
		}
	}
	fmt.Println("deal result is:")
	fmt.Println(s)
}

func TestSliceCap(t *testing.T) {
	//说先定义一个切片,只限定长度为1
	s := make([]int, 1)

	//打印出slice的长度,容量以及内存地址
	fmt.Printf("len :%d cap:%d array ptr :%v \n", len(s), cap(s), *(*unsafe.Pointer)(unsafe.Pointer(&s)))

	for i := 1; i < 1024*2; i++ {
		s = append(s, i)
		fmt.Printf("len :%d cap:%d array ptr :%v \n", len(s), cap(s), *(*unsafe.Pointer)(unsafe.Pointer(&s)))
	}
	//打印出slice
	fmt.Println("array:", s)
}

测试

执行测试代码 go test -v slice_test.go 可以查看执行结果

go test 使用请看:go test 使用

golang 使用样例汇总:go test

你可能感兴趣的文章

go array 使用

go defer 使用

go file 使用

go func 使用

go http 使用

go interface 使用

go main 使用

go map 使用

go math 使用

go method 使用

0  赞