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与函数传值的理解的更多相关文章

  1. [].slice.call(arguments,1) 个人理解

    var arr = []; [] == arr; 假设 var arr = [1,2,3,4,5]; 那么 arr.slice(1,2) == [2]; 通过 slice.call 才能使用call显 ...

  2. jquery的ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 代码如下: $.ajax({ dataType : ‘json', type : ‘POST', url : ‘http: ...

  3. memcpy、memmove、memset及strcpy函数实现和理解

    memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...

  4. ORACLE时间函数(SYSDATE)深入理解

    ORACLE时间函数(SYSDATE)深入理解 加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add ...

  5. [java学习笔记]java语言基础概述之函数的定义和使用&函数传值问题

    1.函数 1.什么是函数? 定义在类中的具有特定功能的一段独立小程序. 函数也叫做方法 2.函数的格式 修饰符   返回值类型    函数名(参数类型  形式参数1, 参数类型  形式参数2-) { ...

  6. 函数指针的理解 from 数据结构

    今天在学习数据结构中遇到一些问题,函数的指针不知道怎么用,给自己科普一哈 1 int LocateElem_Sq(SqList L, LElemType_Sq e, Status(*Compare)( ...

  7. js 基础 函数传值

    让我忽略的函数传值问题 function box(num){ num += 10;  // num(有色的num) 实际就是arguments[0] ,如果参数没有num,则函数体的num(有色的nu ...

  8. Vue父子组件生命周期执行顺序及钩子函数的个人理解

    先附一张官网上的vue实例的生命周期图,每个Vue实例在被创建的时候都需要经过一系列的初始化过程,例如需要设置数据监听,编译模板,将实例挂载到DOM并在数据变化时更新DOM等.同时在这个过程中也会运行 ...

  9. ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 复制代码 代码如下: $.ajax({ dataType : ‘json',type : ‘POST',url : ‘ht ...

随机推荐

  1. windows下如何安装Composer?

    Composer 不是一个包管理器,它仅仅是一个依赖管理工具.它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目 ...

  2. java 利用TCP上传文件

    从客户端上传到服务器端,其实本质上也就是复制! package july76net; //上传文件(文本) import java.io.BufferedReader; import java.io. ...

  3. 【7003】&&【a203】合并多项式

    Time Limit: 3 second Memory Limit: 2 MB 问题描述      求两个一元多项式的和.输入多项式方式为:多项式项数.每项系数和指数,按指数从大到小的顺序输入.输出多 ...

  4. Codevs 均分纸牌(贪心)

    题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸 ...

  5. HeidiSQL工具导出导入MySQL数据

    有时候,为了数据方便导出导入SQL,我们可以借助一定的工具,方便我们队数据库的移植,可以达到事半功倍的效果.在这里,就给大家简单的介绍一款能方便导出或者导入MySQL的数据. ①首先,选择你要导出的数 ...

  6. excel转换成实体

    package com.cinc.ecmp.utils; import java.io.IOException; import java.io.InputStream; import java.lan ...

  7. 常用MouseEvent鼠标事件对象&KeyboardEvent键盘事件对象&常用键盘码

    MouseEvent鼠标事件对象: e.target //=> 事件源(操作的是哪个元素) e.clientX e.clientY //当前鼠标触发点距离当前窗口左上角的X|Y轴坐标 e.pag ...

  8. SQL语句之子语句

    子语句之间的顺序: WHERE  GROUP  ORDER LIMIT

  9. 仿快播APP源码

    目录 仿快播系统 一.项目总结三步走 二.项目需求分析 三.搭建框架 四.ORM框架分析 五.功能分析 六.项目开发--仿快播视频 服务端client start.py ---- 启动文件 conf ...

  10. JVM内存结构探秘及编码实战

    了解JVM内存结构的目的 在Java的开发过程中,因为有JVM自动内存管理机制,不再需要像在C.C++开发那样手动释放对象的内存空间,不容易出现内存泄漏和内存溢出的问题.但是,正是由于把内存管理的权利 ...