面试题答案
一键面试代码实现
package main
import "fmt"
// 定义结构体
type Person struct {
Name string
Age int
}
// 定义修改结构体字段的函数
func modifyPerson(p *Person) {
p.Name = "New Name"
p.Age = 30
}
你可以这样调用这个函数:
func main() {
person := Person{Name: "Original Name", Age: 25}
modifyPerson(&person)
fmt.Printf("Name: %s, Age: %d\n", person.Name, person.Age)
}
内存管理影响
- 传递结构体值:
- 当传递结构体值时,会在函数调用栈中创建结构体的一个副本。如果结构体较大,包含很多字段或者嵌套了较大的结构体,这会占用较多的栈空间,因为整个结构体的内容都被复制了一份。
- 函数内部对副本的修改不会影响原结构体,所以如果需要将修改结果反映到原结构体,需要返回修改后的副本并重新赋值给原变量。这在一定程度上增加了代码的复杂性。
- 传递结构体指针:
- 传递结构体指针时,在函数调用栈中只需要传递指针本身,通常指针的大小是固定的(比如在64位系统上是8字节),无论结构体实际大小如何,这样可以节省栈空间,特别是对于大结构体。
- 函数内部通过指针直接修改原结构体的内容,不需要返回修改后的结果,使得代码逻辑更简洁。同时,由于多个函数可以通过同一个指针操作同一个结构体,可能会带来数据竞争的问题,在并发编程中需要特别注意使用锁等机制来保证数据的一致性。