01-go基础-06-切片(声明切片、初始化切片、切片赋值、切片长度、切片容量、空切片、append、copy)

news2024/11/25 2:41:14

文章目录

  • 1. 声明切片
  • 2. 初始化切片
    • 2.1 切片长度
      • 2.1.1 初始化指定长度的切片
      • 2.1.2 查看切片长度 len()
    • 2.2 切片容量
      • 2.2.1 初始化指定容量的切片
      • 2.2.2 查看切片长度 len()
  • 3 切片赋值
    • 3.1 直接赋值
    • 3.2 引用数组给切片赋值
    • 3.3 引用数组某区间给切片赋值
      • 3.3.1 从数组位置N个取到第M个元素,赋值给切片
        • - 语法
        • - 示例
      • 3.3.2 从数组位置N取到结尾,赋值给切片
        • - 语法
        • - 示例
      • 3.3.3 从开头取到第M个元素,赋值给切片
        • - 语法
        • - 示例
    • 3.4 通过切片赋值给切片
  • 4. 空切片
    • 4.1 仅声明的切片为空
    • 4.2 初始容量为0的切片不为空
  • 5. append()
    • - 语法
    • - 示例1(添加一个成员)
    • - 示例2(添加多个成员)
    • - 示例3(添加成员赋值给新切片)
  • 6. copy() 函数
    • - 语法
    • - 示例1(新切片长度 >= 原切片长度)
    • - 示例2 (新切片长度 < 原切片长度)
    • - 示例2 (新切未初始化)

数组和切片的区别
数组是需要指定个数的,而切片则不需要。

1. 声明切片

  • 语法
var  SliceName []type
  • 语法示例

定义一个切片,且切片成员为字符串类型

var names []string

2. 初始化切片

声明切片的同时,为切片分配一个内存地址。

2.1 切片长度

2.1.1 初始化指定长度的切片

说明:len表示数组长度,即切片的初始长度

  • 语法
var  slice1  = make([]type, len)

在函数内,可简写做:

slice1 := make([]type, len)
  • 语法示例
var names  = make([]string,3)

函数内可以写做:

names  := make([]string,3)

当然你也可以先声明,然后在初始化

var names []string
names  = make([]string,3)

2.1.2 查看切片长度 len()

  • 语法
len(SliceName)
  • 示例
package main

import "fmt"

func main() {
	names  := make([]string,10)
	fmt.Printf("切片:%+v\n长度为:%d",names,len(names))
}

结果打印

切片:[         ]
长度为:10
  • 说明:

问:明明打印的切片没有成员,为什么长度为10?
答:可以看见我们打印出的结果是[ ]而不是[]。这里边有9个空格,即是10个成员间的9个分隔符(空格)。我们看不到成员,是因为这10个成员的值默认都是空(字串不赋值默认为空)。如果我们定义切片成员类型是int我们将看到打印出10个0(int类型不赋值,默认为0)

package main

import "fmt"

func main() {
	slice1  := make([]int,10)
	fmt.Printf("切片:%+v\n长度为:%d",slice1,len(slice1))
}

结果:

切片:[0 0 0 0 0 0 0 0 0 0]
长度为:10

2.2 切片容量

2.2.1 初始化指定容量的切片

  • cap可选,指容量。

说明:

  • len是目前的成员数
  • cap是切片的上限

每增加 一个成员,len 值加1,成员数达到cap值后,cap值翻倍。

  • 语法
slice1 := make([]type, len, cap)
  • 语法示例
names  := make([]string,3,5)

2.2.2 查看切片长度 len()

  • 语法
cap(SliceName)
  • 示例
package main

import "fmt"

func main() {
	names  := make([]string,3,5)
	fmt.Printf("切片长度为:%d,容量为:%d",len(names),cap(names))
}

结果打印

切片长度为:3,容量为:5

3 切片赋值

3.1 直接赋值

  • 语法示例

在函数内我们用:在赋值的同时也声明了切片(只用=仅赋值但不能声明切片)

names :=[]string{"刘备","关羽","张飞" }
  • 完整示例
package main
import "fmt"

func main() {
	names := []string{"刘备","关羽","张飞"}
	fmt.Printf("打印切片:%+v\n长度为:%d\n容量为:%d",names,len(names),cap(names))
}

结果显示

打印切片:[刘备 关羽 张飞]
长度为:3
容量为:3

3.2 引用数组给切片赋值

  • 语法
s := arr[:]
  • 示例
package main

import "fmt"

func main() {
	namesArray := [3]string{"刘备","关羽","张飞"} //定义一个数组
	names  := namesArray[:]  //声明切片并用数组给切片赋值
	fmt.Printf("打印切片:%+v\n长度为:%d\n容量为:%d",names,len(names),cap(names))
}

执行结果为:

打印切片:[刘备 关羽 张飞]
长度为:3
容量为:3

3.3 引用数组某区间给切片赋值

前提:设N为起始位置,到第M个成员。

3.3.1 从数组位置N个取到第M个元素,赋值给切片

- 语法

s := arr[N:M]

- 示例

  • 需求:从元素的位置1(刘备是位置0,关羽是位置1),取到第3个成员(第一个成员是刘备,第二个是关羽,第三个是张飞)
  • 预计:切片将取到 关羽、张飞两个成员。
  • 代码如下
package main

import "fmt"

func main() {
	namesArray := [5]string{"刘备","关羽","张飞","赵云","诸葛亮"} //定义一个数组
	names  := namesArray[1:3]
	fmt.Printf("打印切片:%+v\n长度为:%d\n容量为:%d",names,len(names),cap(names))
}
  • 结果打印
打印切片:[关羽 张飞]
长度为:2
容量为:4
  • 说明

长度是2,因为我们取到了两个成员:关羽、张飞
容量是4,这是从起始位置1(关羽)起,计算到数组结尾(诸葛亮),一共四个位置。

虽然没有取到赵云和诸葛亮,但是容量已经加进来了

3.3.2 从数组位置N取到结尾,赋值给切片

- 语法

s := arr[N:]

- 示例

  • 代码
package main

import "fmt"

func main() {
	namesArray := [5]string{"刘备","关羽","张飞","赵云","诸葛亮"} //定义一个数组
	names  := namesArray[1:]
	fmt.Printf("打印切片:%+v\n长度为:%d\n容量为:%d",names,len(names),cap(names))
}
  • 结果显示
打印切片:[关羽 张飞 赵云 诸葛亮]
长度为:4
容量为:4
  • 说明
    长度是4,因为我们取到了4个成员:关羽、张飞、赵云、诸葛亮
    容量是4,这是从起始位置1(关羽)起,计算到数组结尾(诸葛亮),一共四个位置。

3.3.3 从开头取到第M个元素,赋值给切片

- 语法

s := arr[:M]

- 示例

  • 需求:从开头(位置0)取到第二个成员(关羽)
package main

import "fmt"

func main() {
	namesArray := [5]string{"刘备","关羽","张飞","赵云","诸葛亮"} //定义一个数组
	names  := namesArray[:3]
	fmt.Printf("打印切片:%+v\n长度为:%d\n容量为:%d",names,len(names),cap(names))
}

结果打印

打印切片:[刘备 关羽 张飞]
长度为:3
容量为:5
  • 说明
    长度是3,因为我们取到了3个成员:刘备、关羽、张飞
    容量是5,这是从起始位置0(刘备)起,计算到数组结尾(诸葛亮),一共四个位置。

3.4 通过切片赋值给切片

说明:通过切片s初始化切片s1

s2 := s1[N:M]

方法同数组赋值给切片

4. 空切片

4.1 仅声明的切片为空

package main

import "fmt"

func main() {
	var names []string

	fmt.Printf("打印切片:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))

	if names == nil {
		fmt.Printf("切片是空的")
	}else {
		fmt.Println("切片不为空")
	}
}
  • 结果
打印切片:[]
长度为:0
容量为:0
切片是空的

4.2 初始容量为0的切片不为空

package main

import "fmt"

func main() {
	var names = make([]string,0,0)
	fmt.Printf("打印切片:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))

	if names == nil {
		fmt.Println("切片是空的")
	}else {
		fmt.Println("切片不为空")
	}
}

结果打印

打印切片:[]
长度为:0
容量为:0
切片不为空

5. append()

- 语法

  • 语法
func append(slice []Type, elems ...Type) []Type
  • 语法示例
names = append(names,"赵云")

- 示例1(添加一个成员)

  • 代码
package main

import "fmt"

func main() {
	names := []string{"刘备","关羽","张飞"} 
	fmt.Printf("原切片:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))

	names = append(names,"赵云")
	fmt.Printf("==================\n添加成员后:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))
}
  • 结果
原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
==================
添加成员后:[刘备 关羽 张飞 赵云]
长度为:4
容量为:6
  • 说明:

结果可见,当成员达到容量上限后,再添加成员,长度增加一,但是容量会翻倍。

- 示例2(添加多个成员)

我们再继续添加成员,也想验证一下长度和容量的变化。

  • 代码
package main

import "fmt"

func main() {
	names := []string{"刘备","关羽","张飞"} 
	fmt.Printf("原切片:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))

	names = append(names,"赵云")
	fmt.Printf("==================\n添加成员后:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))


	names = append(names,"马超","黄忠","魏延")
	fmt.Printf("==================\n添加成员后:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))
}
  • 结果
原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
==================
添加成员后:[刘备 关羽 张飞 赵云]
长度为:4
容量为:6
==================
添加成员后:[刘备 关羽 张飞 赵云 马超 黄忠 魏延]
长度为:7
容量为:12
  • 说明

可以看到,成员再次超过容量时,容量在当前容量的基础上翻倍。

- 示例3(添加成员赋值给新切片)

  • 代码
package main

import "fmt"

func main() {
	names := []string{"刘备","关羽","张飞"}
	fmt.Printf("原切片:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))

	names2 := append(names,"赵云")
	fmt.Printf("==================\n新切片:%+v\n长度为:%d\n容量为:%d\n",names2,len(names2),cap(names2))
	fmt.Printf("==================\n再次打印原切片:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))
}
  • 结果显示
原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
==================
新切片:[刘备 关羽 张飞 赵云]
长度为:4
容量为:6
==================
再次打印原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
  • 说明:

结果可见,append对于原切片并不会造成影响。

6. copy() 函数

- 语法

func copy(dst []Type, src []Type) int

返回成功拷贝了多少个元素

- 示例1(新切片长度 >= 原切片长度)

  • 代码
package main

import "fmt"

func main() {
	names := []string{"刘备","关羽","张飞"}
	fmt.Printf("原切片:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))

    names2 := make([]string,4,4)
	num := copy(names2,names)
	fmt.Printf("==================\n新切片:%+v\n拷贝了%d个元素\n长度为:%d\n容量为:%d\n",names2,num,len(names2),cap(names2))
	fmt.Printf("==================\n再次打印原切片:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))
}
  • 结果
原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
==================
新切片:[刘备 关羽 张飞 ]
拷贝了3个元素
长度为:4
容量为:4
==================
再次打印原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
  • 说明

如上可见,初始化长度为4,拷贝了3个元素,但是我们可以看到新切片最后有一个空格,是第3和第4个元素的分隔符,只是第四个元素为空

- 示例2 (新切片长度 < 原切片长度)

  • 代码
package main

import "fmt"

func main() {
	names := []string{"刘备","关羽","张飞"}
	fmt.Printf("原切片:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))

    names2 := make([]string,2,4)
	num := copy(names2,names)
	fmt.Printf("==================\n新切片:%+v\n拷贝了%d个元素\n长度为:%d\n容量为:%d\n",names2,num,len(names2),cap(names2))
	fmt.Printf("==================\n再次打印原切片:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))
}
  • 结果显示
原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
==================
新切片:[刘备 关羽]
拷贝了2个元素
长度为:2
容量为:4
==================
再次打印原切片:[刘备 关羽 张飞]
长度为:3
容量为:3

- 示例2 (新切未初始化)

新切片未初始化的结果类似于初始化长度为0的切片

  • 代码
package main

import "fmt"

func main() {
	names := []string{"刘备","关羽","张飞"} 
	fmt.Printf("原切片:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))

    var names2 []string
	if names2 == nil{
		fmt.Println("==================\nnames2 为空")
	}else{
		fmt.Println("==================\nname2 不为空")
	}
	num := copy(names2,names)
	fmt.Printf("新切片:%+v\n拷贝了%d个元素\n长度为:%d\n容量为:%d\n",names2,num,len(names2),cap(names2))
	fmt.Printf("==================\n再次打印原切片:%+v\n长度为:%d\n容量为:%d\n",names,len(names),cap(names))
}
  • 结果
原切片:[刘备 关羽 张飞]
长度为:3
容量为:3
==================
names2 为空
新切片:[]
拷贝了0个元素
长度为:0
容量为:0
==================
再次打印原切片:[刘备 关羽 张飞]
长度为:3
容量为:3

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s中的Pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元; Pod 中会启动一个或一组紧密相关的业务容器, 各个业务容器相当于Pod 中的各个进程, 此时就可以将Pod 作为虚拟机看待; 在创建 Pod 时会启动一个init容器, 用来初始化存储和网络, 其余的业务容器都将在init容器…

redis在实践中的一些常见问题以及优化思路(包含linux内核参数优化)

文章目录redis在实践中的一些常见问题以及优化思路&#xff08;包含linux内核参数优化&#xff09;fork耗时导致高并发请求延时AOF的阻塞问题主从复制延迟问题主从复制风暴问题vm.overcommit_memoryswapiness最大打开文件句柄tcp backlogredis在实践中的一些常见问题以及优化思…

【数据库高级】Mysql窗口函数的使用和练习

Mysql窗口函数&#x1f33e;Mysql窗口函数&#x1f54a;️一、什么是窗口函数&#x1f343;1、怎么理解窗口?&#x1f343;2、什么是窗口函数&#x1f375;1. 基本语法&#xff1a;&#x1f375;2. 窗口函数多用在什么场景&#xff1f;主要有以下两类&#xff1a;&#x1f375…

【AAAI2023】视觉辅助的常识知识获取Visually Grounded Commonsense Knowledge Acquisition 个人学习笔记

视觉辅助的常识知识获取 摘要&#xff1a;大规模的常识知识库为广泛的AI应用提供了能力&#xff0c;其中常识知识的自动提取extraction of commonsense knowledge (CKE)是一个基本和具有挑战性的问题。文本中的CKE因其固有的稀疏性和文本中常识的报道偏差reporting bias而闻名…

Windows OpenGL ES 图像色调

目录 一.OpenGL ES 图像色调 1.原始图片2.效果演示 二.OpenGL ES 图像色调源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL E…

Java+JSP+MySQL基于SSM的在线投票系统-计算机毕业设计

项目介绍 随着社会的发展&#xff0c;人们在处理一些问题的时候不同意见越来越多&#xff0c;这源于人们对思想的解放和对社会的认识。所以在处理同一问题上&#xff0c;为了征求不同人的意见在线投票系统诞生了。 基于SSM的在线投票系统以钦州学院为背景&#xff0c;运用在校…

CSS详解

文章目录1. CSS快速入门2. 四种CSS导入方式3. 三种基本选择器4. 层次选择器5. 结构伪类选择器5. 属性选择器6. CSS样式HTML(结构)CSS(表现)JavaScript(交互)1. CSS快速入门 <style>可以编写css代码&#xff0c;每一个声明&#xff0c;最好使用分号; <!DOCTYPE html&…

【JavaWeb】Servlet系列 --- HttpServletRequest接口详解(接口方法要记住!!!)

HttpServletRequest接口一、HttpServletRequest接口中有哪些常用的方法&#xff1f;思考&#xff1a;如果是前端的form表单提交了数据之后&#xff0c;你准备怎么存储这些数据&#xff0c;你准备采用什么样的数据结构去存储这些数据呢&#xff1f;二、request接口中四个非常重要…

FlutterAcivity 包已导入 但是仍然爆红

FlutterAcivity 包已导入 但是仍然爆红 这种情况就比较广泛了 我说一下我遇到的这种情况 上一篇 FlutterActivity找不到http://t.csdn.cn/HvgtI 1.大家可以看到我这个FlutterActivity包已导入 但是依然报错 2.可以清楚的看到我这个提示是 LifecycleOwner 找不到我们点Flutter…

智慧工地安全施工实时监测系统解决方案

背景介绍 随着经济的发展&#xff0c;混凝土搅拌车数量有很大增长&#xff0c;但是其超速、超载等原因造成了很多交通事故&#xff0c;给交通安全带来隐患&#xff0c;也给企业造成损失&#xff0c;严重影响了和谐城市建设的进程。 中国电子科技集团第52研究所经过多年研发与…

React子组件没有随父组件更新问题的解决

前言&#xff1a;今天遇到一个小需求&#xff0c;本来只是修改文案的&#xff0c;结果问题卡了很久很久&#xff0c;想想还是太菜了 问题描述&#xff1a; 根据changePlaceHolder修改AInput的placeholder的默认值&#xff0c;AInput是封装的antd的input组件&#xff0c;期间发…

图片一键调整工具V1.0-免费版

一、工具介绍 这是博主自己开发的图片一键调整工具V1.0,它可以调整图片宽度和高度、压缩图片大小、改变图片背景、转换图片格式和图片透明化&#xff0c;都是很常用的功能。操作起来简单方便。 二、工具操作 1.调整图片背景 首先&#xff0c;把该工具软件和图片放到同一文件…

Linux基础知识与实操-篇二:初识Linux目录管理与操作

文章目录文件与目录管理相对路径与绝对路径目录相关操作查阅文件相关操作文件预设权限搜索与文件文件的搜索基本权限与指令最后在经过上篇 篇一:初识Linux文件权限与配置 后&#xff0c;我们已经基本熟悉并使用了Linux关于文件管理相关的内容&#xff0c;本篇则继续从文件深入…

CrossOver2023虚拟机软件安装双系统教程

您喜欢切换Windows系统吗&#xff1f;喜欢&#xff1f;好吧&#xff0c;您随意。对于其他人而言&#xff0c;想要不依赖于笨重的 Windows 模拟器就能在您的 Mac 系统上运行微软的应用程序&#xff0c;CrossOver是最简单的方式。讲真&#xff0c;您试过模拟器了吗&#xff1f;您…

如何使用Python访问和查询Google BigQuery数据

要使用Python查询Google BigQuery数据&#xff0c;需要将Python客户端连接到BigQuery实例。 将会云客户端库用于Google BigQuery API. 假设您已经设置了Python开发环境。(支持3.7-3.11版本)要安装该库&#xff0c;请在命令行中运行以下命令&#xff1a; pip install --upgrade…

【国际化Intl】Flutter 国际化多语言实践

目标&#xff1a;实现flutter国际化 提示&#xff1a;这里参考一下几个链接 例如&#xff1a; https://github.com/ThinkerWing/language https://juejin.cn/post/6844903823119482888 这篇也很详细&#xff0c;还有包括兼容中文的繁体简体… 可以看看 feat/use-Flutter-Int…

python函数进阶

一、函数多返回值 Q&#xff1a;如果一个函数内两个return&#xff0c;程序如何执行&#xff1f; A&#xff1a;只执行了第一个return&#xff0c;原因是因为return可以退出当前函数&#xff0c;导致return下方的代码不执行 但是如果一个函数需要有多个返回值&#xff0c;该如…

华为云数据库GaussDB(for Cassandra)揭秘:高性能低成本是什么样的体验?

在我们的日常理念中&#xff0c;追求性价比是最为常见的&#xff0c;但是你知道购买低配置还能享受高性能、低延时、超低价的数据库有哪些吗&#xff1f;今天我们就用数据说话&#xff0c;带你深入了解GaussDB(for Cassandra)挑战高性价比&#xff01; 众所周知&#xff0c;有…

Android开发者们想想:到底是市场饱和?还是你们技术饱和?

根据我的不客观数据体验来看&#xff0c;最饱和的是iOS&#xff0c;同样发布一个职位iOS是其他技术岗位10倍的投递量。当然Android作为一个已经市场化将近十几年的技术门类&#xff0c;它必然早已经是成熟常态。这样的技术行业都不再会有爆炸式的增长。连同Android硬件、手机、…

Go学习之路:方法和接口(DAY 3)

文章目录前引方法和接口1.1、方法/声明方法1.2、方法/捆绑其他类型1.3、方法/方法常用指针传递1.4、方法/普通函数指针传递和方法指针传递区别2.1、接口/方法签名集合2.2、接口/接口断言2.3、接口/switch case练习题、接口/stringer实现字符串打印2.4、接口/错误前引 昨天终于算…