MST
星途 面试题库

面试题:Go语言中指针与结构体结合的使用

假设有一个结构体 `Person`,包含 `name`(字符串类型)和 `age`(整数类型)字段。请编写一个函数,接收 `Person` 结构体指针作为参数,修改其 `age` 字段值并返回修改后的结构体指针,同时解释下为什么使用指针而不是直接传递结构体。
11.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import "fmt"

// 定义Person结构体
type Person struct {
    name string
    age  int
}

// 修改age字段值并返回修改后的结构体指针
func modifyAge(p *Person, newAge int) *Person {
    p.age = newAge
    return p
}

使用指针而不是直接传递结构体主要有以下原因:

  1. 性能优化:当结构体比较大时,直接传递结构体需要复制整个结构体内容,开销较大。而传递指针只需要复制一个指针的大小(通常为4字节或8字节),大大提高了效率。
  2. 对原数据的修改:如果直接传递结构体,函数内部对结构体的修改不会影响到原结构体。而通过传递指针,函数可以直接修改原结构体的数据,这在需要改变调用者传入数据的场景中非常有用。

你可以使用以下方式调用这个函数:

func main() {
    p := Person{name: "Alice", age: 30}
    newP := modifyAge(&p, 35)
    fmt.Printf("Name: %s, Age: %d\n", newP.name, newP.age)
}

上述代码定义了一个 Person 结构体,modifyAge 函数接收一个 Person 结构体指针和新的年龄值,修改 age 字段并返回修改后的指针。在 main 函数中,创建一个 Person 实例,调用 modifyAge 函数并打印修改后的结果。