面试题答案
一键面试在Go语言中,虽然没有传统的类概念,但可以在结构体上定义方法来实现类似面向对象编程的行为。
定义方法的语法如下:
type 结构体类型名 struct {
// 结构体字段定义
}
func (接收者 结构体类型名) 方法名(参数列表) 返回值列表 {
// 方法实现
}
其中,(接收者 结构体类型名)
部分就是方法的接收者声明。
值接收者和指针接收者的区别
-
值接收者:
- 方法接收的是结构体值的副本,对接收者的任何修改都不会影响原始结构体。
- 适用于不需要修改原始结构体,且结构体本身较小,复制成本较低的情况。
示例:
package main import "fmt" type Person struct { Name string Age int } func (p Person) PrintInfo() { fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age) } func main() { p := Person{Name: "Alice", Age: 30} p.PrintInfo() }
-
指针接收者:
- 方法接收的是结构体的指针,对接收者的修改会影响原始结构体。
- 适用于需要修改原始结构体,或者结构体较大,复制成本较高的情况。
示例:
package main import "fmt" type Counter struct { Value int } func (c *Counter) Increment() { c.Value++ } func main() { counter := Counter{Value: 0} counter.Increment() fmt.Println(counter.Value) // 输出: 1 }
适用场景总结
-
值接收者:
- 当方法只是读取结构体的状态,而不改变它时,使用值接收者。例如,用于打印结构体信息的方法。
- 当结构体比较小,复制成本低时,值接收者也能满足需求。
-
指针接收者:
- 当方法需要修改结构体的状态时,必须使用指针接收者。
- 对于较大的结构体,为了避免复制带来的性能开销,也应使用指针接收者。