Go语言中如何将结构体作为函数参数传递?
解决方案
你的代码已经正确定义了接收Person结构体的test函数,只是没有在main函数里调用它。Go语言中把结构体作为参数传递非常直接,主要有两种方式:
1. 值传递(直接传结构体实例)
这是你当前代码采用的方式,直接把结构体变量传给函数,函数会创建一个结构体的副本。在main函数里添加调用语句即可:
package main import "fmt" type Person struct { name string age int job string salary int } func test(class Person) { fmt.Println("Name: ", class.name) fmt.Println("Age: ", class.age) fmt.Println("Job: ", class.job) fmt.Println("Salary: ", class.salary) fmt.Println("---") // 分隔两个实例的输出 } func main() { var pers1 Person var pers2 Person pers1.name = "Hege" pers1.age = 45 pers1.job = "Teacher" pers1.salary = 6000 pers2.name = "Cecilie" pers2.age = 24 pers2.job = "Marketing" pers2.salary = 4500 // 直接将结构体实例作为参数传递 test(pers1) test(pers2) }
运行这段代码,就能看到两个Person实例的信息被打印出来。
2. 指针传递(传结构体指针)
如果结构体比较大,值传递会产生额外的拷贝开销,这时可以用指针传递。修改test函数的参数类型为*Person,调用时传结构体的地址即可:
package main import "fmt" type Person struct { name string age int job string salary int } // 参数改为结构体指针 func test(class *Person) { // Go会自动对指针解引用,直接用class.name即可 fmt.Println("Name: ", class.name) fmt.Println("Age: ", class.age) fmt.Println("Job: ", class.job) fmt.Println("Salary: ", class.salary) fmt.Println("---") } func main() { var pers1 Person var pers2 Person pers1.name = "Hege" pers1.age = 45 pers1.job = "Teacher" pers1.salary = 6000 pers2.name = "Cecilie" pers2.age = 24 pers2.job = "Marketing" pers2.salary = 4500 // 传递结构体的地址 test(&pers1) test(&pers2) }
指针传递的好处是函数操作的是原结构体的内存,不会产生拷贝,同时如果需要修改结构体的内容,指针传递也能直接生效(值传递只能修改副本,不影响原变量)。
内容的提问来源于stack exchange,提问作者Mudassir Waheed
相关产品推荐
相关产品推荐

