go值变量和引用变量

爱编程_喵 / 2023-08-28 / 原文

目录
  • 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可以用作任何数据类型
*/

image