• 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
    ", sVal)
    	fmt.Printf("sRef:%s
    ", sRef)
    	fmt.Printf("dVal:%s
    ", string(dVal))
    	fmt.Printf("dRef:%s
    ", string(dRef))
    	fmt.Printf("sRet:%s
    ", string(sRet))
    	fmt.Printf("dRet:%s
    ", string(dRet))
    
    	var k, v string
    	for k, v = range mVal {
    		fmt.Printf("mVal[%s]:%s
    ", k, v)
    	}
    
    	for k, v = range mRef {
    		fmt.Printf("mRef[%s]:%s
    ", 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
    

    验证了官方的说法。可见万变不离其宗,编程无他,唯手熟尔。

    学习知识的法则: 学习 + 实践 + 思考

  • 相关阅读:
    移动端 viewport设置
    js 数组去重
    常用排序算法之JavaScript实现
    当Table中td内容为空时,显示边框的办法
    html5标签
    CSS z-index 属性的使用方法和层级树的概念
    seajs第二节,seajs各模块依赖关系
    seajs第一节,seajs基本使用
    强大的矢量图形库:Raphael JS 中文帮助文档及教程
    apache日志轮转
  • 原文地址:https://www.cnblogs.com/technic-emotion/p/3643998.html
Copyright © 2020-2023  润新知