Go语言学习笔记【5】 传值/地址/引用、管道、协程

【声明】

非完全原创,部分内容来自于学习其他人的理论和B站视频。如果有侵权,请联系我,可以立即删除掉。

一、函数形参传参的方式

一般有3种:传值、地址、引用

1、传值

go语言中基本数据类型、结构体、数组都是传值。
其特点在于:传递给函数的参数是被传数据的的副本,因此对形参(也就副本)的值进行更改操作时,并不会影响原始数据
同时,由于传值时,需要拷贝一份数据给形参,因此比较耗费资源。

type Student struct {
   
	Name string
	Id   int
}

func Pass_struct(s Student) {
   
	s.Name = "hello, go"
	fmt.Printf("func afer_operating addr s = %p\tvalue_s = %+v\n", &s, s)
}

func Pass_array(arr [3]int) {
   
	arr[0] = 9999
	fmt.Printf("func afer_operating addr arr = %p\tvalue_arr = %v\n", &arr, arr)
}

func Pass_value(a bool, b string, c byte, d int8, e complex64, f float32, g rune) {
   
	a = true
	b = "hello, go"
	c = 'A'
	d = 66
	e = complex(3, 4) // 3 + 4i
	f = 88.0
	g = '国'
	fmt.Println("func afer_operating addr a = ", &a, "\tvalue_a = ", a)
	fmt.Println("func afer_operating addr b = ", &b, "\tvalue_b = ", b)
	fmt.Printf("func afer_operating addr c = 0x%x\tvalue_c = %c\n", &c, c)
	fmt.Println("func afer_operating addr d = ", &d, "\tvalue_d = ", d)
	fmt.Println("func afer_operating addr e = ", &e, "\tvalue_e = ", e)
	fmt.Println("func afer_operating addr f = ", &f, "\tvalue_f = ", f)
	fmt.Printf("func afer_operating addr g = 0x%x\tvalue_g = %c\n", &g, g)
}

func main() {
   
	s := Student{
   
		Id:   2022,
		Name: "Jack",
	}
	arr := [3]int{
   7, 7, 7}
	a := false
	b := "this is a blog!"
	var c byte = 'a'
	var d int8 = 0
	var e complex64 = complex(1, 2)
	var f float32 = 0.0
	var g rune = '中'
	
	fmt.Printf("\nmain before_operating addr s = %p\tvalue_s = %+v\n", &s, s)
	fmt.Printf("main before_operating addr arr = %p\tvalue_arr = %v\n", &arr, arr)
	fmt.Println("main before_operating addr a = ", &a, "\tvalue_a = ", a)
	fmt.Println("main before_operating addr b = ", &b, "\tvalue_b = ", b)
	fmt.Printf("main before_operating addr c = 0x%x\tvalue_c = %c\n", &c, c)
	fmt.Println("main before_operating addr d = ", &d, "\tvalue_d = ", d)
	fmt.Println("main before_operating addr e = ", &e, "\tvalue_e = ", e)
	fmt.Println("main before_operating addr f = ", &f, "\tvalue_f = ", f)
	fmt.Printf("main before_operating addr g = 0x%x\tvalue_g = %c\n\n", &g, g)

	Pass_struct(s)
	Pass_array(arr)
	Pass_value(a, b, c, d, e, f, g)

	fmt.Printf("\nmain afer_func addr s = %p\tvalue_s = %+v\n", &s, s)
	fmt.Printf("main afer_func addr arr = %p\tvalue_arr = %v\n", &arr, arr)
	fmt.Println("main afer_func addr a = ", &a, "\tvalue_a = ", a)
	fmt.Println("main afer_func addr b = ", &b, "\tvalue_b = ", b)
	fmt.Printf("main afer_func addr c = 0x%x\tvalue_c = %c\n", &c, c)
	fmt.Println("main afer_func addr d = ", &d, "\tvalue_d = ", d)
	fmt.Println("main afer_func addr e = ", &e, "\tvalue_e = ", e)
	fmt.Println("main afer_func addr f = ", &f, "\tvalue_f = ", f)
	fmt.Printf("main afer_func addr g = 0x%x\tvalue_g = %c\n", &g, g)
}

output:
main before_operating addr s = 0xc00009e060	value_s = {
   Name:Jack Id:2022}
main before_operating addr arr = 0xc0000ae078	value_arr = [7 7 7]
main before_operating addr a =  0xc0000aa058 	value_a =  false
main before_operating addr b =  0xc000088240 	value_b =  this is a blog!
main before_operating addr c = 0xc0000aa059	value_c = a
main before_operating addr d =  0xc0000aa05a 	value_d =  0
main before_operating addr e =  0xc0000aa090 	value_e =  (1+2i)
main before_operating addr f =  0xc0000aa098 	value_f =  0
main before_operating addr g = 0xc0000aa09c	value_g =func afer_operating addr s = 0xc00009e090	value_s = {
   Name:hello, go Id:2022}
func afer_operating addr arr = 0xc0000ae0a8	value_arr = [9999 7 7]
func afer_operating addr a =  0xc0000aa0d0 	value_a =  true
func afer_operating addr b =  0xc000088260 	value_b =  hello, go
func afer_operating addr c = 0xc0000aa0d1	value_c = A
func afer_operating addr d =  0xc0000aa0d2 	value_d =  66
func afer_operating addr e =  0xc0000aa0d8 	value_e =  (3+4i)
func afer_operating addr f =  0xc0000aa0e0 	value_f 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值