golang值传递和引用传递

时间:2021-06-12
本文章向大家介绍golang值传递和引用传递,主要包括golang值传递和引用传递使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、值传递和引用传递区别

package main

import (
	"fmt"
)

func main() {
	// map
	m := make(map[int]string)
	m[0] = "a"
	m[1] = "b"
	changeMap(m)
	fmt.Printf("map:%+v", m)  //输出 map:map[0:aaa 1:b]
	fmt.Println()

	//array
	var a = [2]string{"a", "b"}
	changeArray(a)
	fmt.Printf("array:%+v", a) //输出array:[a b]
	fmt.Println()

	//slice
	var s = []string{"a", "b"}
	changeSlice(s)
	fmt.Printf("slice:%+v", s) //输出slice:[aaa b]
}

func changeMap(m map[int]string) {
	m[0] = "aaa"
}

func changeArray(a [2]string) {
	a[0] = "aaa"
}

func changeSlice(s []string) {
	s[0] = "aaa"
}

二、结构体传递指针或者值

1、值传递

package main

type T struct{
	Value 		int
}

func main(){
	myT := T{Value:666}

	change(myT)

	println(myT.Value)

}
func change(t T){
	t.Value = 999

程序的输出是 666 ,因为这种方法传递的是值一个副本,在change() 函数中,你实际上修改的是副本的值

2、指针传递

package main

type T struct{
	Value 		int
}

func main(){
	myT := T{Value:666}

	change(&myT)

	println(myT.Value)

}
func change(t *T){
	t.Value = 999
} 

这段程序使用了&取地址操作符来获取结构体的地址,而change()函数期望一个T结构体的地址类型 *T,这里*T的意思是指向类型T值得指针;

程序运行输出 999

原文地址:https://www.cnblogs.com/wuchangblog/p/14878619.html