Go 语言之旅方法(Methods)与接口(Interfaces)完全指南

1. 方法(Method)是什么?

在 Go 中 没有类 (class) ,但你可以给任意用户定义类型添加方法。

方法就是带有 接收者(receiver) 的函数,接收者在 func 关键字与方法名之间定义。(Go Tour)


基础方法声明格式

复制代码
func (r ReceiverType) MethodName(params) returns {
    // 方法体
}

这里:

  • (r ReceiverType) 就是接收者

  • r 相当于 Go 中的 this / self

  • 方法属于其接收者类型


示例:给自定义类型定义方法

复制代码
package main
import "fmt"

type Circle struct {
    radius float64
}

// 为 Circle 类型定义 Area 方法
func (c Circle) Area() float64 {
    return 3.1416 * c.radius * c.radius
}

func main() {
    c := Circle{radius: 5}
    fmt.Println("面积:", c.Area())
}

2. 值接收者 vs 指针接收者

Go 中有两种方法接收者:

值接收者(value receiver)

复制代码
func (c Circle) Area() float64 { ... }
  • 用于 不会修改对象本身 的方法

  • 像基础值传入一样复制一份


指针接收者(pointer receiver)

复制代码
func (c *Circle) Scale(factor float64) {
    c.radius *= factor
}
  • 使用 *Type

  • 可修改原始值

  • 性能更节省复制开销


3. 为什么用方法而不是普通函数?

方法可以:

✔ 把行为 绑到某个类型上

✔ 实现抽象 / 多态

✔ 与接口配合发挥更强逻辑


4. 接口(Interface)是什么?

接口定义了一组 方法签名

只要某个类型实现了接口中的所有方法,这个类型就是接口的实现者。

Go 中的接口是 隐式实现(implicit implementation) ,无需显式声明。(HackMD)


定义接口示例

复制代码
type Shape interface {
    Area() float64
}

这里 Shape 是一个接口,任何拥有 Area() float64 方法的类型都实现了 Shape


赋值到接口变量

Go 允许 Shape 类型的变量保存任何实现了 Area() 的类型:

复制代码
var s Shape
s = Circle{radius: 5}
fmt.Println(s.Area())

5. 接口使用技巧

多个方法的接口

复制代码
type FullName interface {
    FirstName() string
    LastName() string
}

一个类型必须实现全部才能 satisfy 接口。


空接口(interface{})

Go 中任何类型都实现了空接口。空接口可以持有任意类型:

复制代码
var x interface{}
x = 42
x = "Hello"

6. 接口的动态值与类型

接口值内部有两部分:

🔹 动态类型 (实际存放值的类型)

🔹 动态值(当前值)

当你调用接口方法时,Go 会根据动态值去执行实际类型的方法。


7. 接口的零值

复制代码
var s Shape

此时 snil 接口值,调用其方法会 panic。


8. 接口常见用途

✔ 抽象行为

✔ 编写函数更灵活

✔ 支持多态

✔ 组合更复杂的逻辑

例如:

复制代码
func PrintArea(s Shape) {
    fmt.Println(s.Area())
}

只要是 Shape,就可以传入。


总结

概念 说明
方法 有接收者的函数,属于类型
值接收者 不修改原值
指针接收者 修改原值
接口 方法集合,行为抽象
隐式实现 不需显式声明 implements
相关推荐
历程里程碑1 小时前
双指针巧解LeetCode接雨水难题
java·开发语言·数据结构·c++·python·flask·排序算法
qualifying2 小时前
JAVAEE——多线程(2)
java·开发语言
ALex_zry2 小时前
C++ 中多继承与虚函数表的内存布局解析
java·开发语言·c++
杰瑞不懂代码2 小时前
基于 MATLAB 的 AM/DSB-SC/VSB 模拟调制与解调仿真及性能对比研究
开发语言·matlab·语音识别·am·dsb-sc·vsb
霁月的小屋2 小时前
从Vue3与Vite的区别切入:详解Props校验与组件实例
开发语言·前端·javascript·vue.js
趣知岛2 小时前
初识DeepSeek
开发语言·人工智能·deepseek
superman超哥2 小时前
仓颉编译器优化揭秘:尾递归优化的原理与实践艺术
开发语言·后端·仓颉编程语言·仓颉·仓颉语言·尾递归·仓颉编译器
lkbhua莱克瓦242 小时前
基础-SQL-DML
开发语言·数据库·笔记·sql·mysql
独自破碎E2 小时前
说一下消息队列有哪些模型
java·开发语言