Golang中slice切片的实现示例

 更新时间:2024年09月11日 11:27:18   作者:五敷有你  
Go语言中,切片是对数组的抽象,提供了更灵活的动态数组解决方案,本文就来介绍一下Golang中slice切片的实现示例,感兴趣的可以了解一下

slice

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

数组的使用

package main

import (
	"fmt"
)

// 传递固定长度的数组还是值传递的方式
func printArray(myArray [5]int) {
	for index, value := range myArray {
		fmt.Println("index:", index, "value:", value)
	}

}


func main() {
	var myArr [5]int

	myArr2 := [10]int{1, 2, 3, 4}
	myArr3 := [4]int{1, 2, 3, 4}
	myArr4 := []int{1, 2, 3, 4}

	for i := 0; i < len(myArr); i++ {
		fmt.Println(myArr[i])
	}
	for index, value := range myArr2 {
		fmt.Println("index:", index, "value:", value)
	}

	fmt.Printf("myArr1 type=%T\n", myArr)
	fmt.Printf("myArr2 type=%T\n", myArr2)
	fmt.Printf("myArr3 type=%T\n", myArr3)
	
}

注意

数组传递的参数是以值拷贝的形式进行传递,如下:(在函数中修改了,但在主函数中并没有变化)

package main

import (
	"fmt"
)

// 传递固定长度的数组还是值传递的方式
func printArray(myArray [5]int) {
	for index, value := range myArray {
		fmt.Println("index:", index, "value:", value)
	}
	myArray[0] = 15

}

func main() {

	myArr2 := [5]int{1, 2, 3, 4}
	printArray(myArr2)
	fmt.Println("==================")
	for index, value := range myArr2 {
		fmt.Println("index:", index, "value:", value)
	}

}

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

定义切片

可以声明一个未指定大小的数组来定义切片(切片不需要说明长度。)

var identifier []type

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

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


也可以简写为


slice1 := make([]type, len)

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

make([]T, length, capacity)

切片的四种初始化的方式

package main

import "fmt"

func main() {
	//声明slice是一个切片,并且初始化,默认值是1,2,3长度是len=3
	slice1 := []int{1, 2, 3}
	//声明slice是一个切片,但是并没有为slice分配空间
	var slice2 []int
	slice2 = make([]int, 10, 15)
	slice2[0] = 100

	//声明slice是一个切片,同时给slice分配3个空间,初始化值是0
	var slice3 []int = make([]int, 10)

	//声明slice是一个切片,同时为slice分配空间,10个空间,初始化值是0,通过:=推导出slice是一个切片
	slice4 := make([]int, 10)

	fmt.Printf("len=%d,slice=%v\n", len(slice1), slice1)
	fmt.Printf("len=%d,slice=%v,cap=%d\n", len(slice2), slice2, cap(slice2))
	fmt.Printf("len=%d,slice=%v\n", len(slice3), slice3)
	fmt.Printf("len=%d,slice=%v\n", len(slice4), slice4)


}

切片的追加,截取与拷贝

切片示意图:

追加

如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来

长度增加后,超过容量,则容量增加2倍

package main

import "fmt"

func main() {
	var numbers = make([]int, 3, 5)
	fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)
	numbers = append(numbers, 1)
	fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)
	numbers = append(numbers, 1)
	numbers = append(numbers, 1)
	fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)

}

截取

	s := []int{1, 2, 3}
	//左闭右开
	s1 := s[0:2]
	s1[0] = 100
	s[1] = 200
	fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s), cap(s), s)
	fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s1), cap(s1), s1)

拷贝

截取是采用的浅拷贝,是指向的同一个地址。

如果要深拷贝。可以使用copy函数

	s := []int{1, 2, 3}
	var s1 = make([]int, 3)
	copy(s1, s)
	s1[0] = 100
	fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s), cap(s), s)
	fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s1), cap(s1), s1)

到此这篇关于Golang中slice切片的实现示例的文章就介绍到这了,更多相关Golang slice切片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go语言中字符串嵌套的几种实现方式

    go语言中字符串嵌套的几种实现方式

    在Go语言中,字符串嵌套可以通过多种方式实现,包括使用双引号和转义字符、反引号、字符串拼接和格式化字符串,下面就来介绍一下,感兴趣的可以了解一下
    2025-03-03
  • intelliJ idea安装go开发环境并搭建go项目(打包)全过程

    intelliJ idea安装go开发环境并搭建go项目(打包)全过程

    最近在配置idea开发go语言时碰到很多问题,所以这里给大家总结下,这篇文章主要给大家介绍了关于intelliJ idea安装go开发环境并搭建go项目(打包)的相关资料,需要的朋友可以参考下
    2023-10-10
  • Go语言使用singleflight解决缓存击穿

    Go语言使用singleflight解决缓存击穿

    在构建高性能的服务时,缓存是优化数据库压力和提高响应速度的关键技术,但使用缓存也会带来一些问题,其中就包括缓存击穿,下面我们就来看看Go语言中如何使用singleflight解决缓存击穿问题吧
    2024-03-03
  • Go Gin中间件的具体使用

    Go Gin中间件的具体使用

    中间件是Gin框架中的一个重要概念,它可以用来处理HTTP请求和响应,或者在处理请求之前和之后执行一些操作,本文主要介绍了Go Gin中间件的具体使用,感兴趣的可以了解一下
    2023-11-11
  • go语言 http模型reactor示例详解

    go语言 http模型reactor示例详解

    这篇文章主要介绍了go语言 http模型reactor,接下来看一段基于reactor的示例,这里运行通过 go run main.go,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Go语言基础学习之指针详解

    Go语言基础学习之指针详解

    Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。所以本文就来和大家聊聊Go语言中指针的定义与使用,需要的可以参考一下
    2022-12-12
  • Go 代码生成工具详解

    Go 代码生成工具详解

    这篇文章主要介绍了Go 代码生成工具详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Golang利用位运算实现为程序加速

    Golang利用位运算实现为程序加速

    这篇文章主要为大家详细介绍了如何在Golang中利用位运算实现为程序加速功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-08-08
  • 在Golang中使用iota案例详解

    在Golang中使用iota案例详解

    在Go语言中,iota是一个预定义的标识符,用于在常量声明中生成连续的递增值,iota的值从0开始,每次在常量声明中使用时递增,本就给大家讲解一下Golang中iota的使用案例,感兴趣的同学跟着小编一起来看看吧
    2023-07-07
  • Go中的fuzz模糊测试使用实战详解

    Go中的fuzz模糊测试使用实战详解

    这篇文章主要为大家介绍了Go中的fuzz模糊测试使用实战详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论