go slice与函数传值的理解
go语言中所有的传值方式都是传值操作。
今天遇到了以下代码:
func main(){
slice := make([]int ,,)
fmt.Println(slice)
change(s)
fmt.Println(slice)
}
func change(s []int){
s = append(s,)
}
输出结果是:
0
0
当时感到有些疑惑,学c或c++时,传入的参数为指针(数组首地址)时,change内这种直接修改参数s方法时可以修改值的,那么为何在go中无效呢?
1.go语言中,所有的参数传递都是值传递。
什么意思?就是在函数传递值时,都会拷一个副本传递给函数进行操作,就算是引用类型或者指针也不例外。
例如:
func main(){
st := make([]int, 1, 1)
fmt.Printf("st 原始切片的地址为:%p\n", &st)
SliceTest(st)
}
func SliceTest(s []int) {
fmt.Printf("st 传入后参数s的地址为:%p\n", &s)
s = append(s, )
}
在我的电脑上的输出为:
st 原始切片的地址为:0xc000004540
st 传入后参数s的地址为:0xc000004560
可以看到,go语言中仅仅拷贝了st的一个副本进入SliceTest函数中进行操作,并未操作st本身。
2.go语言的切片,实际上是指向一个底层的数组。
在进入SliceTest函数时,s和st指向的底层数组都一样。
但是,经过append的操作,s原本指向的底层数组不满足追加元素的条件,所以要开辟一个新的数组来进行追加操作。
于是,s会指向一个新的底层数组。
但是这些操作和原切片st完全无关,因为s仅仅是st的副本,它们的地址不一样,s指向了新的数组,st并未改变,所以就有了开篇那段代码的结果。
对go的传值理解进一步加深。
go slice与函数传值的理解的更多相关文章
- [].slice.call(arguments,1) 个人理解
var arr = []; [] == arr; 假设 var arr = [1,2,3,4,5]; 那么 arr.slice(1,2) == [2]; 通过 slice.call 才能使用call显 ...
- jquery的ajax()函数传值中文乱码解决方法介绍
jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 代码如下: $.ajax({ dataType : ‘json', type : ‘POST', url : ‘http: ...
- memcpy、memmove、memset及strcpy函数实现和理解
memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...
- ORACLE时间函数(SYSDATE)深入理解
ORACLE时间函数(SYSDATE)深入理解 加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add ...
- [java学习笔记]java语言基础概述之函数的定义和使用&函数传值问题
1.函数 1.什么是函数? 定义在类中的具有特定功能的一段独立小程序. 函数也叫做方法 2.函数的格式 修饰符 返回值类型 函数名(参数类型 形式参数1, 参数类型 形式参数2-) { ...
- 函数指针的理解 from 数据结构
今天在学习数据结构中遇到一些问题,函数的指针不知道怎么用,给自己科普一哈 1 int LocateElem_Sq(SqList L, LElemType_Sq e, Status(*Compare)( ...
- js 基础 函数传值
让我忽略的函数传值问题 function box(num){ num += 10; // num(有色的num) 实际就是arguments[0] ,如果参数没有num,则函数体的num(有色的nu ...
- Vue父子组件生命周期执行顺序及钩子函数的个人理解
先附一张官网上的vue实例的生命周期图,每个Vue实例在被创建的时候都需要经过一系列的初始化过程,例如需要设置数据监听,编译模板,将实例挂载到DOM并在数据变化时更新DOM等.同时在这个过程中也会运行 ...
- ajax()函数传值中文乱码解决方法介绍
jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 复制代码 代码如下: $.ajax({ dataType : ‘json',type : ‘POST',url : ‘ht ...
随机推荐
- H3C 启动包过滤防火墙功能
- Vue 组件中的data数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- element-ui隐藏组件el-scrollbar
代码如下: <div class="main_wrapper"> <el-scrollbar wrapClass="scrollar_container ...
- win10 uwp 好看的时间选择控件
本文告诉大家我找到的好看的时间选择控件 先给大家看一下图,然后就知道我说的是什么 首先需要安装 Nuget ,搜索 DeanChalk.UWP.TimePicker 或输入Install-Packag ...
- CF1045G AI robots
CF1045G AI robots 题目大意就不说了 这道题可以用CDQ分治做 但是,如何选择CDQ分治的维度一直是CDQ分治的难点所在 这道题我们有三种选择 1.让智商高的数智商低的 2.让看的近的 ...
- 2018-2-13-win10-uwp-listView-绑定前一项
title author date CreateTime categories win10 uwp listView 绑定前一项 lindexi 2018-2-13 17:23:3 +0800 201 ...
- HDU3669 Aragorn's Story 树链剖分 点权
HDU3669 Aragorn's Story 树链剖分 点权 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: n个点的,m条边,每个点都 ...
- 仿快播APP源码
目录 仿快播系统 一.项目总结三步走 二.项目需求分析 三.搭建框架 四.ORM框架分析 五.功能分析 六.项目开发--仿快播视频 服务端client start.py ---- 启动文件 conf ...
- ABP-AsyncLocal的使用
1.与AsyncLocal对应的是ThreadLocal 2.两种类型 初始赋值 AsyncLocalString.Value = new List { "1" }; AsyncL ...
- nginx部署vue跨域proxy方式
server { listen 80; charset utf-8; #server_name localhost; server_name you_h5_name; ###VUE项目H5域名 err ...