首页 > 其他分享 >GO 学习笔记之三 基础语法(5) 切片

GO 学习笔记之三 基础语法(5) 切片

时间:2024-12-27 09:31:11浏览次数:6  
标签:printSlice int 之三 len 切片 numbers GO fmt

一、定义

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

其存在容量和长度的说法,长度是实际数据的长度,容量是可容纳的数组长度。容量也可以进行扩充或缩减。

1、初始化时直接赋值

//1.直接初始化切片,[] 表示是切片类型,{1,2,3} 初始化值依次是 1,2,3,其 cap=len=3。
s := []int{1, 2, 3}

2、从已有的动态数组中初始化

//初始化切片 s1,是数组 s 的引用。  将数组s的值全部给s1,s\s1 数组内容一样
s1 := s[:]
//初始化切片 s2,是从下标 startIndex 到 endIndex-1 下的元素创建为一个新的切片。
s2 := s[1:3]

3、初始化时不赋值,使用默认值

//使用make初始化切片 make(数组变量,长度,容量)
s3 := make([]int, 3)   #定义了长度为3的数组
s4 := make([]int, 3,5)  #定义了长度为3,容量为5 的数组,有长度的下标0,1,2 才有初始值 0, 剩下两个容量无

4、定义空数组(空切片)

     仅进行了声明,但是长度和容量都未定义,且未进行数组的赋值

package main
 
import "fmt"
 
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
 
func main() {
 
//3.空切片
var numbers []int
printSlice(numbers)
if numbers == nil {
fmt.Println("切片是空的呢")
}
}

完整如下:

package main
 
import "fmt"
 
func main() {
//1.直接初始化切片,[] 表示是切片类型,{1,2,3} 初始化值依次是 1,2,3,其 cap=len=3。
s := []int{1, 2, 3}
fmt.Println("切片s:", s)
//初始化切片 s1,是数组 s 的引用。
s1 := s[:]
fmt.Println("切片s1:", s1)
//初始化切片 s2,是从下标 startIndex 到 endIndex-1 下的元素创建为一个新的切片。
s2 := s[1:3]
fmt.Println("切片s2:", s2)
//使用make初始化切片
s3 := make([]int, 3)
fmt.Println("切片s3:", s3)
}

二、使用

1、从已有的动态数组中截取出子数组

  数组名2 := 数组名1[startIndex:endIndex]       #表示从数组中截取下表为startIndex的项一直到endIndex-1的项

//初始化切片 s2,是从下标 startIndex 到 endIndex-1 下的元素创建为一个新的切片。
s2 := s[1:3]
package main
 
import "fmt"
 
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
 
func main() {
 
//切片截取举例
/* 创建切片 */
numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
printSlice(numbers)
 
/* 打印原始切片 */
fmt.Println("numbers ==", numbers)
 
/* 打印子切片从索引1(包含) 到索引4(不包含)*/
fmt.Println("numbers[1:4] ==", numbers[1:4])
 
/* 默认下限为 0*/
fmt.Println("numbers[:3] ==", numbers[:3])
 
/* 默认上限为 len(s)*/
fmt.Println("numbers[4:] ==", numbers[4:])
 
numbers1 := make([]int, 0, 5)
printSlice(numbers1)
 
/* 打印子切片从索引 0(包含) 到索引 2(不包含) */
number2 := numbers[:2]
printSlice(number2)
 
/* 打印子切片从索引 2(包含) 到索引 5(不包含) */
number3 := numbers[2:5]
printSlice(number3)
}

2、计算数组的长度和容量

  • len() 方法获取切片的长度
  • cap()方法 可以测量切片最长可以达到多少
package main
 
import "fmt"
 
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
 
func main() {
 
//2调用printSlice方法获取切片的长度与容量
var numbers = make([]int, 3, 5)
printSlice(numbers)
}

3、扩容

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

  • append()     #当长度和容量相同时,通过append 方式增加元素,长度和容量都会增加
  • copy() 
package main
 
import "fmt"
 
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
 
func main() {
 
//5.append() 和 copy() 函数
var numbers []int
printSlice(numbers)
 
/* 允许追加空切片 */
numbers = append(numbers, 0)
printSlice(numbers)
 
/* 向切片添加一个元素 */
numbers = append(numbers, 1)
printSlice(numbers)
 
/* 同时添加多个元素 */
numbers = append(numbers, 2,3,4)
printSlice(numbers)
 
/* 创建切片 numbers1 是之前切片的两倍容量*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
 
/* 拷贝 numbers 的内容到 numbers1 */
copy(numbers1,numbers)
printSlice(numbers1)
}

 4、将字符串根据分隔符转成切片

   strings.Split(字符串,分割符)

func auth() gin.HandlerFunc {
    _token_ignored_urls := service.GetStringFromInneral("token.ignored")   // 从properties文件中读取 token.ignored 配置项的值
    _token_ignored_urls = strings.TrimSpace(_token_ignored_urls)   //去掉空格
    if len(_token_ignored_urls) != 0 {   
        return authWhitelist(strings.Split(_token_ignored_urls, ","))   将字符串 _token_ignored_urls 按照 逗号 进行分割形成 切片
} return authWhitelist(nil) }

 

 

标签:printSlice,int,之三,len,切片,numbers,GO,fmt
From: https://www.cnblogs.com/sandyflower/p/18597997

相关文章

  • 马斯克新logo亮相!如何结合品牌logo打造出彩的网站设计?
    近日,马斯克旗下xAI公司的人工智能产品Grok引发热议,其新LOGO更是吸引了众多目光。这个新LOGO通过圆环与斜线的巧妙结合,传递出“突破”与“连接”的品牌精神,彰显了马斯克品牌中“前沿科技”的核心属性,其简洁有力的设计风格让人印象深刻。对于任何品牌而言,logo都......
  • [Paper Reading] StegoType: Surface Typing from Egocentric Cameras
    目录StegoType:SurfaceTypingfromEgocentricCamerasTL;DRData数据采集设备开环数据收集闭环数据收集数据容错机制OracleMethodInputFeaturesBackboneDataLossExperiment效果可视化总结与思考相关链接Relatedworks中值得深挖的工作资料查询StegoType:SurfaceTypingfrom......
  • Java和Go语言的优劣势对比
    文章目录Java和Go语言的优劣势对比一、引言二、设计哲学与语法特性1、设计哲学2、语法特性三、性能与内存管理1、性能2、内存管理和垃圾回收四、并发编程模型五、使用示例1、Go语言示例代码2、Java语言示例代码六、对比表格七、总结Java和Go语言的优劣势对比一、......
  • LeetCode - Google 校招100题 第8天 图(Graph) (2题)
    欢迎关注我的CSDN:https://spike.blog.csdn.net/本文地址:https://spike.blog.csdn.net/article/details/144744820LeetCode合计最常见的112题:校招100题第1天链表(List)(19题)校招100题第2天树(Tree)(21题)校招100题第3天动态规划(DP)(20题)校招100题第4天......
  • 深度解析 Python 网络框架:Django、Tornado、Flask 和 Twisted
    目录引言Python网络框架概述Django:全栈开发的首选框架3.1Django的核心特性3.2Django的应用场景3.3优势与不足Tornado:高性能的异步框架4.1Tornado的异步特性4.2Tornado的应用场景4.3优势与不足Flask:轻量级的微框架5.1Flask的核心特性5.2Flask的应用场景......
  • mongodb常见报错
    mongodb常见报错目录mongodb常见报错MongoDB异常MongoCursorNotFoundException背景:问题分析:解决方案方案一:null方案二:方案三:方案四:MongoDB异常MongoCursorNotFoundException报错内容:om.mongodb.MongoCursorNotFoundException:Queryfailedwitherrorcode-5Causedby:......
  • 【记录一个问题】prefetch 指令在golang中未见到明显效果
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯偶尔了解到DPDK的代码中,使用prefetch指令可能让包处理速度加快10%~15%.尝试在golang中引入prefetch指令,但是未简单明显的加速效果。先说结论:1如果数据......
  • go-echart 简单使用
    GOechart简单使用packagemainimport( "os" "github.com/go-echarts/go-echarts/v2/charts" "github.com/go-echarts/go-echarts/v2/event" "github.com/go-echarts/go-echarts/v2/opts")funcmain(){ //创建图表实例 graph......
  • 基于python+Django的招聘信息可视化与薪资预测系统
    1.项目背景本系统旨在帮助用户更高效地管理和分析招聘信息,通过爬虫抓取招聘数据、可视化分析招聘市场情况,并提供薪资预测功能。项目采用Django框架开发,具有以下主要功能:从招聘网站抓取招聘数据。存储与管理招聘信息。提供基于数据的可视化分析。实现简单的薪资预测功能。......
  • centos7.9 安装mongodb4.4.8
    安装依赖,命令如下sudoyuminstalllibcurlopensslxz-libs下载压缩包,地址如下https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.8.tgz解压压缩包,解压存放路径,根据自己定义来,我这里放到/home目录下tar-zxvfmongodb-linux-x86_64-rhel70-4.4.8.tgz复制......