八、4.值类型与引用类型

1.值类型与引用类型

package main

import "fmt"
func main() {
    //引用类型与值类型
    //引用类型:将变量赋值给另一个变量 修改新变量 会对其他的产生影响
    //值类型:将变量赋值给另一个变量  修改新变量 不会对其他的产生影响
    array := [3]string{"1", "2", "3"}
    slice := []string{"1", "2", "3"}
    array01 := array
    slice01 := slice
    array01[0] = "3"
    slice01[0] = "3"
    fmt.Println(array01, array)
    fmt.Printf("%p %p\n", &array01, &array)
    fmt.Println(slice01, slice)
    fmt.Printf("%p %p\n", &slice01, &slice)
    //针对值类型和引用类型在赋值后新旧变量的地址并不相同,只是一样弄类型在底层共享数据结构(其中包含指针类型元素)
    //int(值类型) bool(值类型) float32(值类型) float64(值类型) array(值类型) slice(引用类型) map(引用类型) 指针
    //值类型:int bool float32 float64 array 指针
    //引用类型:slice map
    a := map[string]int{"a": 2}
    b := a
    b["a"] = 3
    fmt.Println(a, b)
    fmt.Printf("%p %p \n", a, b)
}

2.值传递与引用传递

(1)值传递
在 Go 语言中参数传递默认均为值传递(形参为实参变量的副本),对于引用类型数据因其底
层共享数据结构,所以在函数内可对引用类型数据修改从而影响函数外的原变量信息
2) 引用传递
可以通过将变量的地址通过指类型递给函数,此时可通过指针对函数外的原变量进行修改

package main

import "fmt"
func inta(a int) {
    a = 200
}
func selicenum(num []int) {
    num[0] = 200
}
func changenum(p *int) {
    *p = 200
}
func main() {
    //对于值类型在函数间的传递 不会对原先的变量有影响,对于引用类型的 会有影响
    num := []int{1, 2, 3, 4, 5}
    a := 2
    fmt.Println(num)
    fmt.Println(a)
    inta(a)
    selicenum(num)
    fmt.Println(num)
    fmt.Println(a)
    //这里相当于直接把内存地址的值改了  所以会变
    //形参实参所在的内存地址不同 但是指向的都是同一个内存地址(指针)
    changenum(&a)
    fmt.Println(a)
}
发布了92 篇原创文章 · 获赞 12 · 访问量 5686

猜你喜欢

转载自blog.csdn.net/weixin_45413603/article/details/104786715
今日推荐