zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    有一种努力叫“凌晨四点”
    编程思想
    小记
    团队精神与集体主义
    变量起名
    软件项目估量方法
    戏说QQ
    压力说
    AngularJS指令基础(一)
    Leetcode 1021. Best Sightseeing Pair
  • 原文地址:https://www.cnblogs.com/wuchangblog/p/14878619.html
Copyright © 2011-2022 走看看