PHP中高级工程师面试重点讲解视频课程
Go快速入门浅显易懂视频教程-基础篇
Go快速入门浅显易懂视频教程-中级篇
go的值传递和引用传递以及引用类型的问题
阅读:947 分享次数:0

 package main

import(
    "fmt"
)

// int string 参数传递是值传递 非引用类型
// map 参数传递是值传递 引用类型

var a int = 9
var b string = "aa"
var c map[int]int

func modify1(a int) {
    fmt.Println("值:",a)
    fmt.Println("地址:",&a)
    a = 10
    fmt.Println("值:", a)
    fmt.Println("地址:", &a)
}
func modify2(a string) {
    fmt.Println("值:",a)
    fmt.Println("地址:",&a)
    a = "cccc"
    fmt.Println("值:", a)
    fmt.Println("地址:", &a)
}

func modify3(a map[int]int) {
    fmt.Println("值:",a)
    fmt.Printf("地址:%p\n",&a)
    a[4] = 10
    fmt.Println("值:", a)
    fmt.Printf("地址:%p\n",&a)
}


func main(){
    fmt.Println("值:", a)
    fmt.Println("地址:", &a)
    modify1(a)
    fmt.Println("值:", a)
    fmt.Println("地址:", &a)

    fmt.Println("值:", b)
    fmt.Println("地址:", &b)
    modify2(b)
    fmt.Println("值:", b)
    fmt.Println("地址:", &b)
    
    c = make(map[int]int)
    c[4] = 9
     
    fmt.Println("值:", c)
    fmt.Printf("地址:%p\n", &c)
    modify3(c)
    fmt.Println("值:", c)
    fmt.Printf("地址:%p\n", &c)
}

//Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。因为拷贝的内容有时候是非引用类型(int、string、struct等这些),这样就在函数中就无法修改原内容数据;有的是引用类型(指针、map、slice、chan等这些),这样就可以修改原内容数据。是否可以修改原内容数据,和传值、传引用没有必然的关系。在C++中,传引用肯定是可以修改原内容数据的,在Go语言里,虽然只有传值,但是我们也可以修改原内容数据,因为参数是引用类型。这里也要记住,引用类型和传引用是两个概念。再记住,Go里只有传值(值传递)。

感觉本站内容不错,读后有收获?