go值变量和引用变量
目录
- go值变量和引用变量
go值变量和引用变量
package daily
import "fmt"
func VerifyParams() {
/**
验证值变量和引用变量
*/
// 1. 值类型
// 1.1 基本数据类型
fmt.Println(">>>值类型(基本数据类型)")
var myInt1 int
myInt2 := myInt1
myInt2 = 3
fmt.Printf("myInt1(%p)=%v\nmyInt2(%p)=%v\nmyInt1=myInt2(%t)\n",
&myInt1, myInt1, &myInt2, myInt2, (myInt1 == myInt2))
/**
out:
>>>值类型(基本数据类型)
myInt1(0xc00017a450)=0
myInt2(0xc00017a458)=3
myInt1=myInt2(false)
*/
// 1.2 结构体
fmt.Println(">>>值类型(结构体)")
type myStruct struct {
name string
age uint8
}
ms1 := myStruct{
name: "go",
age: 9,
}
ms2 := ms1
ms2.name = "golang"
fmt.Printf("ms1(%p)=%v\nms2(%p)=%v\nms1==ms2(%t)\n",
&ms1, ms1, &ms2, ms2, (ms1 == ms2))
/**
out:
>>>值类型(结构体)
ms1(0xc0000082e8)={go 9}
ms2(0xc000008300)={golang 9}
ms1==ms2(false)
*/
// 1.3 数组
fmt.Println(">>>值类型(数组)")
myArr1 := [3]int{1, 2, 3}
myArr2 := myArr1
myArr2[0] = 11
fmt.Printf("myArr1(%p)=%v\nmyArr2(%p)=%v\n*myArr1[1]==*myArr2[1](%t)\n",
&myArr1, myArr1, &myArr2, myArr2, (&myArr1[1] == &myArr2[1]))
/**
out:
>>>值类型(数组)
myArr1(0xc000012738)=[1 2 3]
myArr2(0xc000012750)=[11 2 3]
*myArr1[1]==*myArr2[1](false)
*/
// 2. 引用类型
fmt.Println(">>>引用类型(切片)")
mySlice1 := []int{1, 11, 111}
mySlice2 := mySlice1
mySlice2[0] = 2
fmt.Printf("myslice1(%p)=%v\nmyslice2(%p)=%v\n",
mySlice1, mySlice1, mySlice2, mySlice2)
/**
>>>引用类型(切片)
myslice1(0xc0000127b0)=[2 11 111]
myslice2(0xc0000127b0)=[2 11 111]
*/
fmt.Println(">>>引用类型(指针)")
myPtrV1 := []int{2, 22}
var myPtr1 *[]int = &myPtrV1
myPtr2 := myPtr1
myPtrV1[0] = 1
fmt.Printf("myPtr1(%p)=%v\nmyPtr2(%p)=%v\n",
myPtr1, *myPtr1, myPtr2, *myPtr2)
/**
out:
>>>引用类型(指针)
myPtr1(0xc0000083d8)=[1 22]
myPtr2(0xc0000083d8)=[1 22]
*/
fmt.Println(">>>引用类型(映射)")
myMap1 := map[int]int{
1: 11,
2: 22,
}
myMap2 := myMap1
myMap2[1] = 111
fmt.Printf("myMap1(%p)=%v\nmyMap2(%p)=%v\n",
myMap1, myMap1, myMap2, myMap2)
/**
out:
>>>引用类型(映射)
myMap1(0xc0001765a0)=map[1:111 2:22]
myMap2(0xc0001765a0)=map[1:111 2:22]
*/
fmt.Println(">>>引用类型(管道)")
myChan1 := make(chan int, 2)
myChan2 := myChan1
myChan1 <- 1
myChan2 <- 11
//myChan2 <- 22
//myChan1 <- 2 // 报错
fmt.Printf("myChan1(%p)=%v\nmyChan2(%p)=%v\n",
myChan1, <-myChan1, myChan2, <-myChan2)
/**
out:
>>>引用类型(管道)
myChan1(0xc0000464d0)=1
myChan2(0xc0000464d0)=11
*/
}
/**
ps: interface{} 和any可以用作任何数据类型
*/