golang函数的值传递和引用传递

golang函数的值传递和引用传递
强烈推介IDEA2021.1.3破解激活,IntelliJ IDEA 注册码,2021.1.3IDEA 激活码 

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说golang函数的值传递和引用传递,希望能够帮助大家进步!!!

值传递

python对于字符串和数字作为参数传递时,在函数中的值就是直接复制了一个。就像下面这个例子,a和b的地址是同一个但是改变a的值,b的值不会发生改变。

a = 1b = 1print("a",a, id(a), "b",b, id(b))a=2print("a",a, id(a), "b",b, id(b))#####输出结果######a 1 94378359581376 b 1 94378359581376a 2 94378359581408 b 1 94378359581376

在函数内修改时程序会生成一个新的内存地址存储新的值,所有操作都是在函数内部操作仅仅是局部变量,由于是值传递,所以该函数的对该值所有操作都仅限于该函数内,并没有对参数t1进行修改。详情看下面的实例代码。

def test(a): print('a', a, "内存地址", id(a)) a += "qq" print('a', a, "内存地址", id(a)) a += "ww" print('a', a, "内存地址", id(a))if __name__ == '__main__': t1 = "aaaa" print("内存地址", id(t1)) test(t1) print('t1', t1, "内存地址", id(t1))
#######运行结果#######内存地址 140572064233208a aaaa 内存地址 140572064233208a aaaaqq 内存地址 140572064249032a aaaaqqww 内存地址 140572063338224t1 aaaa 内存地址 140572064233208Process finished with exit code 0

引用传递

但是当参数为一个列表时,就又会不同。

def test1(b): print("b", b,"内存地址", id(b)) b.append(6) print("b", b, "内存地址", id(b))if __name__ == '__main__': t2 = [1,2,3,4,5] print("t2", t2,"内存地址", id(t2)) test1(t2) print("t2", t2, "内存地址", id(t2))
#######运行结果##########t2 [1, 2, 3, 4, 5] 内存地址 139999401054088b [1, 2, 3, 4, 5] 内存地址 139999401054088b [1, 2, 3, 4, 5, 6] 内存地址 139999401054088t2 [1, 2, 3, 4, 5, 6] 内存地址 139999401054088Process finished with exit code 0

由上面的代码可以看出经过函数的修改t2的值发生改变,但是内存地址没有发生改变,这就相当与c语言中的指针一样,只是把引用传递过去,函数通过引用可以直接操作该值.

简单来说,可以通过函数来直接改变参数的传值为引用传值,反之就是值传递

本文来源it小白求知路,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/29154

发表评论