GO语言中创建切片的三种实现方式

 更新时间:2023年09月20日 09:12:26   作者:奔跑吧,高同学  
这篇文章主要介绍了GO语言中创建切片的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

GO中三种方式创建切片

第一种方式

var 切片名 []数据类型

var s1[]string
fmt.Println(s1)
fmt.Println(len(s1))

第二种方式

切片名 := []类型{}

s2 := []int{}
fmt.Println(s2)
fmt.Println(len(s2))

第三种方式

使用make()函数创建:make(切片类型,长度,容量)

s3 := make([]int, 3, 5)
fmt.Println(s3)
fmt.Println(len(s3))
fmt.Println(cap(s3))

使用make()函数创建注意事项:

1.make(切片类型,长度,容量)

2.长度是已经初始化的空间。容量是已经开辟的空间,包括已经初始化的空间和空闲的空间

3.切片长度要小于容量

4.len()返回长度,cap()返回容量

5.函数中的容量参数是可以省略的,这是容量与长度相等

s4 := make([]int, 6)
fmt.Println(s4)
fmt.Println(len(s4))
fmt.Println(cap(s4))

go语言—切片的定义

  • 因为数组长度是固定的所以有很多局限性
  • 切片是一个拥有相同元素的可变长序列,是基于数组类型做的一层封装
  • 切片非常灵活,支持自动扩容
  • 切片是引用类型,内部结构包含地址、长度、容量。所以不需要使用额外的内存

1、切片的定义

var a []string // 定义一个空切片,[]中不带任何内容就是切片
var b = []int{} //声明一个整数切片并初始化
var c = []bool{"false","true"} //声明一个布尔切片并初始化
// 切片是引用类型,不支持直接比较,只能和nil比较
fmt.Println(a == nil) //true
fmt.Println(b == nil) //false
fmt.Println(c == nil) //false

2、切片表达式

切片底层就是一个数组,所以可以基于数组通过索引得到切片

a := [5]int{1,2,3,4,5}
b := a[1:3]
// b := a[:]  等同于a数组所有值
fmt.Printf("类型:%T\n值:%s",b,b)
输出:
类型:[]int //int类型切片
值:[2 3]

3、切片的取值和改值

  • 切片也通过索引取值和改值
  • 切片修改值时,底层数组的值也会改变,与切片保持一致
  • 同理,底层数组变化也会影响到切片变化
a := [6]int{1,2,3,4,5,6}
b := a[:] //b为数组a的切片
b[2] = 30 //修改切片b索引为3的值
fmt.Printf("a的类型:%T\na的值:%v",a,a)
fmt.Printf("b的类型:%T\nb的值:%v",b,b)
输出:
a的类型:[6]int
a的值:[1 2 30 4 5 6] //修改切片b,a中值同样被修改
b的类型:[]int
b的值:[1 2 30 4 5 6]

4、切片的长度和容量

切片有自己的长度和容量,可以通过len()函数求长度,cap()函数求切片容量

a := [5]int{1,2,3,4,5}
// 切片长度:指切片当前有多长,即存了多少值
var s []int = a[0:2]
fmt.Println(s) // [1,2,3]
fmt.Println(len(s)) // 3
// 切片容量:指这个切片最多能存多少值,基于底层数组来的
// 但是切片容量并不一定等于数组长度,容量大小取决于切片是从哪个地方开始切数组的,从切数组位置开始往后计算
var s1 []int = a[0:3] //从索引为0的位置向后切
fmt.Println(cap(s1)) // 容量为5
var s2 []int = a[2:] //从索引为2的位置向后切
fmt.Println(cap(s2)) //容量为3

5、使用make()函数创建切片

make()函数可以不基于数组而动态的创建切片

make([]T, size, cap)
  • T:切片的元素类型
  • size:切片中元素的数量
  • cap:切片的容量,cap可以省略,省略时默认等于size
a := make([]int,3,10) // 创建一个长度为3,容量为10的整数型切片,默认0值
fmt.Println(a) // [0,0,0]
fmt.Println(len(a)) // 3   a的内部存储空间分配了10个,但实际只用了3个
fmt.Println(cap(a)) // 10

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • golang基础之字符串与int、int64类型互相转换

    golang基础之字符串与int、int64类型互相转换

    这篇文章主要给大家介绍了关于golang基础之字符串与int、int64类型互相转换的相关资料,在Go语言中string转int是一项常见的操作,需要的朋友可以参考下
    2023-07-07
  • go micro微服务proto开发安装及使用规则

    go micro微服务proto开发安装及使用规则

    这篇文章主要为大家介绍了go micro微服务proto开发中安装Protobuf及基本规范字段的规则详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Go项目配置管理神器之viper的介绍与使用详解

    Go项目配置管理神器之viper的介绍与使用详解

    viper是一个完整的 Go应用程序的配置解决方案,它被设计为在应用程序中工作,并能处理所有类型的配置需求和格式,下面这篇文章主要给大家介绍了关于Go项目配置管理神器之viper的介绍与使用,需要的朋友可以参考下
    2023-02-02
  • 基于Go语言构建RESTful API服务

    基于Go语言构建RESTful API服务

    在实际开发项目中,你编写的服务可以被其他服务使用,这样就组成了微服务的架构;也可以被前端调用,这样就可以前后端分离。那么,本文主要介绍什么是 RESTful API,以及 Go 语言是如何玩转 RESTful API 的
    2021-07-07
  • GoLang基于zap日志库的封装过程详解

    GoLang基于zap日志库的封装过程详解

    Zap是我个人比较喜欢的日志库,是uber开源的,有较好的性能,在项目开发中,经常需要把程序运行过程中各种信息记录下来,有了详细的日志有助于问题排查和功能优化,这篇文章主要介绍了GoLang基于zap日志库的封装过程,想要详细了解可以参考下文
    2023-05-05
  • Golang 探索对Goroutine的控制方法(详解)

    Golang 探索对Goroutine的控制方法(详解)

    下面小编就为大家分享一篇Golang 探索对Goroutine的控制方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • go mod tidy报错解决方法详解

    go mod tidy报错解决方法详解

    这篇文章主要为大家介绍了go mod tidy报错解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • golang操作mongodb的方法

    golang操作mongodb的方法

    这篇文章主要介绍了golang操作mongodb的方法,涉及Go语言操作mongodb的连接、读取及显示的方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Golang配置管理库 Viper的教程详解

    Golang配置管理库 Viper的教程详解

    这篇文章主要介绍了Golang 配置管理库 Viper,使用 viper 能够很好的去管理你的配置文件信息,比如数据库的账号密码,服务器监听的端口,你可以通过更改配置文件去更改这些内容,而不用定位到那一段代码上去,提高了开发效率,需要的朋友可以参考下
    2022-05-05
  • Golang限流器time/rate设计与实现详解

    Golang限流器time/rate设计与实现详解

    在 Golang 库中官方给我们提供了限流器的实现golang.org/x/time/rate,它是基于令牌桶算法(Token Bucket)设计实现的,下面我们就来看看他的具体使用吧
    2024-03-03

最新评论