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. 【codeforces 761D】Dasha and Very Difficult Problem

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  2. php_sphinx安装使用

    Sphinx的简介: Sphinx是一个独立的全文索引引擎,意图为其他应用提供高速.低空间 占用.搜索结果高相关度的全文搜索功能.Sphinx可以非常容易的与 SQL数据库和脚本语言集成.内置MySQ ...

  3. [转]ASP.NET WebApi OWIN 实现 OAuth 2.0

    OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...

  4. P1054 全组合

    题目描述 给定n,m,按字典序输出所有从1-n里面取出m个数的组合.比如从1-3里面取出2个的组合是: 1 2 1 3 2 3 输入格式 输入两个数n,m.其中 \(0<n<=10,0&l ...

  5. 2018-2-13-C#-解析-sln-文件

    title author date CreateTime categories C# 解析 sln 文件 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23 ...

  6. SpringBoot优先级

    1.配置文件 application.properties和application.yml文件可以放在以下四个位置: 外置,在相对于应用程序运行目录的/congfig子目录里. 外置,在应用程序运行的 ...

  7. CF809D Hitchhiking in the Baltic States

    CF809D Hitchhiking in the Baltic States CF809D 长度为n的序列{xi},n<=3e5,范围在(li,ri)之间,求LIS最长是多长g(i,l)表示前 ...

  8. Curator源码阅读 - ConnectionState的管理与监听

    看看Curator框架 为实现对 连接状态ConnectionState的监听,都是怎么构造框架的.后面我们也可以应用到业务的各种监听中. Curator2.13实现 接口 Listener List ...

  9. 善用GIMP(Linux下的Photoshop),图像处理轻松又自由

    善用GIMP(Linux下的Photoshop),图像处理轻松又自由 作者: 善用佳软 日期: 2013-02-16 分类: 2 图像影音 标签: GIMP, image 1. GIMP是什么? GI ...

  10. 云栖深度干货 | 打造“云边一体化”,时序时空数据库TSDB技术原理深度解密

    本文选自云栖大会下一代云数据库分析专场讲师自修的演讲——<TSDB云边一体化时序时空数据库技术揭秘> 自修 —— 阿里云智能数据库产品事业部高级专家       认识TSDB 第一代时序时 ...