【声明】
非完全原创,部分内容来自于学习其他人的理论和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 &