Go语言的传值与传引用
Go语言里的传值与传引用大致与C语言中一致,但有2个特例,map和channel默认传引用,也就是说可以直接修改传入的参数,其他的情况如果不用指针的话,传入的都是参数的副本,在函数中修改不会改变调用者中的变量值。简单的做了一个例子:
package main
import "fmt"
func main() {
fmt.Println("Hello from Go start")
var sVal string
var sRef string
var dVal []byte
var dRef []byte
var mVal map[string]string = make(map[string]string, 1)
var mRef map[string]string = make(map[string]string, 1)
sRet, dRet := paramsTest(sVal, &sRef, dVal, &dRef, mVal, &mRef)
fmt.Printf("sVal:%s\n", sVal)
fmt.Printf("sRef:%s\n", sRef)
fmt.Printf("dVal:%s\n", string(dVal))
fmt.Printf("dRef:%s\n", string(dRef))
fmt.Printf("sRet:%s\n", string(sRet))
fmt.Printf("dRet:%s\n", string(dRet))
var k, v string
for k, v = range mVal {
fmt.Printf("mVal[%s]:%s\n", k, v)
}
for k, v = range mRef {
fmt.Printf("mRef[%s]:%s\n", k, v)
}
fmt.Println("Hello from Go end")
}
func paramsTest(sVal string, sRef *string, dVal []byte, dRef *[]byte, mVal map[string]string, mRef *map[string]string) (sRet string, dRet []byte) {
sVal = "sVal"
*sRef = "sRef"
dVal = []byte("dVal")
*dRef = []byte("dRef")
sRet = "sRet"
dRet = []byte("dRet")
mVal["mVal"] = "mVal"
(*mRef)["mRef"] = "mRef"
return sRet, dRet
}
结果输出:
Hello from Go start
sVal:
sRef:sRef
dVal:
dRef:dRef
sRet:sRet
dRet:dRet
mVal[mVal]:mVal
mRef[mRef]:mRef
Hello from Go end
验证了官方的说法。可见万变不离其宗,编程无他,唯手熟尔。
学习知识的法则: 学习 + 实践 + 思考
Go语言的传值与传引用的更多相关文章
- C语言讲义——传值、传引用
传值 值类型在做参数的时候,函数内使用的是实参的副本. 函数执行完毕后,即使函数内对参数做了修改,调用方的参数还是原来的值. #include <stdio.h> // 值调用 void ...
- go语言---传值和传引用
go语言---传值和传引用 https://blog.csdn.net/cyk2396/article/details/78893828 1.定义: b = a; b.modify(); 如果b的修改 ...
- Go 参数传递是传值还是传引用
什么是传值(值传递)? 传值的意思是:函数传递的总是原来这个东西的一个副本.一个副拷贝.比如我们传递一个 int 类型的参数,传递 的其实这个参数的一个副本:传递一个指针类型的参数,其实传递的是这个指 ...
- Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本文导图: 一.由一个提问引发的思考 在Stack Overflow 看到这样一个问题 ...
- 【转载】Java是传值还是传引用
1. 简单类型是按值传递的 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value).这一点我们可以通过一个简单的例子来说明: /* 例 1 */ /** * @(#) Te ...
- java集合中的传值和传引用
在学习java集合过程中发现了传值和传引用的区别: 我们来看下面两句话 ●java集合就像一种容器,我们可以把多个对象(实际上是对象的引用),丢进该容器.(来自疯狂java讲义) ●当使用Iterat ...
- java中的传值与传引用
java函数中的传值和传引用问题一直是个比较“邪门”的问题,其实java函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一份拷贝,对于类类型传递的是该类参数的引用的拷贝,当在函数体中 ...
- python函数传参是传值还是传引用?
首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...
- java 函数形参传值和传引用的区别
java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. public class TestFun { public static v ...
随机推荐
- 在Eclipse中,如何把一个java项目变成web项目
经常在eclipse中导入web项目时,出现转不了项目类型的问题,导入后就是一个java项目.解决步骤:1.进入项目目录,可看到.project文件,打开.2.找到<natures>... ...
- java ZipOutputStream压缩文件,ZipInputStream解压缩
java中实现zip的压缩与解压缩.java自带的 能实现的功能比较有限. 本程序功能:实现简单的压缩和解压缩,压缩文件夹下的所有文件(文件过滤的话需要对File进一步细节处理). 对中文的支持需要使 ...
- 使用automake等命令自动生成Makefile文件 (转载)
使用automake等命令自动生成Makefile文件 Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...
- 初识less
1 less 安装使用 安装 sudo npm install node-less 使用 mkdir less cd /less lessc demo1.less > test1.css les ...
- 超级文件搜索器(SuperSearch)
写了个工具,各个分享渠道上传太难了,在这里分享给大家吧! 中文名称:超级文件搜索器 英文名称: SuperSearch 适用对象:硬盘里文件达到数万至数千万级的用户 运行环境:WindowXP,Wi ...
- vue-todolist
look:先看效果: 在浏览器的地址输入localhost:8080时,页面展示的是coding和walking两个无序序列,接着在输入框输入任何字符再敲enter回车键时,列表中又增加了一列,但是只 ...
- 常用的web功能测试方法
功能测试就是对产品各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求功能,即是否满足需求.常用的测试方法如下: 1.页面连接检查:每一个连接是否都有对应的页面,并且页面之间切换正确. ...
- locate
pre.cjk { font-family: "Nimbus Mono L", monospace } p { margin-bottom: 0.1in; line-height: ...
- 【图像处理】【SEED-VPM】2.接口
—————————————————————————————————————————————————————————————— 对比 ①最好是HDMI: ②分量也是高清的范围,得是比点对点的HDMI低一 ...
- 1526. Martian Plates
http://acm.timus.ru/problem.aspx?space=1&num=1526 题目大意: 可以从n个碟子中任选一个放在桌子上(不断往上放),也可以把桌子上最顶端的盘子拿走 ...