切片注意事项和细节(3) | 学习笔记

简介: 简介:快速学习切片注意事项和细节(3)

开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map :切片注意事项和细节(3)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/625/detail/9642


切片注意事项和细节(3)

 

内容介绍

一、切片的拷贝操作

二、切片是引用类型,遵守引用传递机制


一、切片的拷贝操作

1.切片使用 copy 内含子函数完成拷贝

举例说明:
func main(){

var a[]int=[](1,2,3,4,5)

var slice =make([]int,10)

fmt.Println(slice)

copy(slice,a)

fmt.Println(slice)

说明: copy(para1, para2): para1 和 para2 都是切片类型。

2.关于拷贝的注意事项,思考题:
下面的代码有没有错误:

var a[]int = []int {1,2,3,4,5} //这里有一个切片a,它是1,2,3,4,5

var slice= make([]int,1)  //切片长度定为1

fmt.Println(slice)  //应该输出一个[0]

copy(slice,a)  //这里是拷贝操作,把a拷贝给 slice;a 和 slice 的元素不同也能拷贝,slice 的元素没有大也不会报错,它只会找到a的第一个元素拷贝给 slice

fmt.Println(slice)  //输出为[1]

说明:上面的代码没有问题,可以运行,最后输出的结果是[1]

切片是引用类型,所以在传递时,遵守引用传递机制。看两段代码,并分析底层原理。

 

二、切片是引用类型,遵守引用传递机制

切片是引用类型,所以在传递时,遵守引用传递机制。看两段代码,并分析底层原理。

1.题1:

func main(){

var slice[]int  //声明了一个切片,此切片不可用,因为此切片没有空间

var arr [5]int =[..]int {1,2,3.4.5)slice= arr[:]  //这是有五个元素的一个整形数组

var slice2 = slice  //将slice交给slice2;也就是说slice和slice2都指向了这个数组

slice2[0]= 10  //通过slice2改变的10

fmt.Println("siice2",slice2)//?  slice2输出是多少- [10,2,3,4,5]

fmt.Println("slice", slice)//?slice输出是多少- [10,2,3,4,5]

fmt.Println("arr", arr)//?arr输出是多少- [10,2,3,4,5]

新建一个文件夹名为 slice,再在此文件下新建一个 main.go;在原代码基础上加上以下代码:

package main

Import (

“fmt”

运行结果如下:

image.png

结果与分析相同

2.题2:

func test(slice int) {   //把切片传递给了一个函数,这个函数也是一个切片

slice[0] = 100  //这里修改slice[0].会改变实参)

func main( ){

var slice= []int {1,2,3,4}  //有一个slice切片

fmt.Println("slice=",slice)// ? 打印出来的结果[1,2,3,4]

test(slice)  //调函数

fmt.Println("slice=", slice)// 这时slice输出什么内容,结果为[100,2,3,4]

}

//因为 slice 是引用类型,test(slice)”传递出去的即是地址,也就是“test(slice)”和“var slice”(主函数slice)是同一个 slice,里面的 slice 是指向外面的 slice的,因此在里面的修改会影响到实参

运行测试结果代码如下:

package main

import (

"fmt"

func test(slice []int) {

slice[0] = 100

func main() {

var slice = [ ]int {1,2,3,4}

fmt.Print1n("slice=", slice)// [1,2,3,4]

test(slice)

fmt.Println( "slice=", slice)// [100,2,3,4]

}

运行结果如下:

image.png

运行结果与分析结果相同

相关文章
|
JavaScript 应用服务中间件 nginx
【项目部署系列教程】5. nginx配置反向代理,解决跨域接口的访问
【项目部署系列教程】5. nginx配置反向代理,解决跨域接口的访问
536 10
|
存储 缓存 网络架构
计算机网络:数据交换方式
计算机网络:数据交换方式
366 3
|
安全 前端开发 测试技术
SystemVerilog学习-01-系统验证概述(一)
SystemVerilog学习-01-系统验证概述
485 0
SystemVerilog学习-01-系统验证概述(一)
|
前端开发 JavaScript Java
基于springboot的学生选课系统
该系统创作于2022年3月,基于springboot技术,数据层为MyBatis,mysql数据库,具有完整的业务逻辑,适合选题:高校、学生选课、大学选课、课程等。
基于springboot的学生选课系统
|
JSON 前端开发 测试技术
postman如何通过json数据进行测试
postman如何通过json数据进行测试
postman如何通过json数据进行测试
|
容器
react-Ant Design框架项目中文字轮播与图片轮播的实现
在react-Ant Design框架项目中实现文字轮播和图片轮播,在这里记录一下,实现过程有一点小坑需要注意
772 0
react-Ant Design框架项目中文字轮播与图片轮播的实现
|
C++
Ubuntu16.04安装VS code图文教程
Ubuntu16.04安装VS code图文教程
418 0
Ubuntu16.04安装VS code图文教程
|
Java 定位技术 Android开发
Android Studio获取开发版SHA1值和发布版SHA1值的史上最详细方法
今天我想把百度地图的定位集成到项目中来,想写个小小的案例,实现一下,但在集成百度地图时首先要申请秘钥,申请秘钥要用到SHA1值,所以今天就来总结一下怎样去获取这个值吧,希望对大家有帮助。
Android Studio获取开发版SHA1值和发布版SHA1值的史上最详细方法
|
Java Linux 虚拟化
Java 大后端各种架构图汇总(建议收藏!!)(3)
Java 大后端各种架构图汇总(建议收藏!!)(3)
552 0
Java 大后端各种架构图汇总(建议收藏!!)(3)
|
SQL 机器学习/深度学习 存储
什么是spark?通俗易懂,一文读懂
什么是spark?通俗易懂,一文读懂
676 0
什么是spark?通俗易懂,一文读懂