You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:40:32