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
相关推荐
冰暮流星5 分钟前
javascript之date对象
开发语言·javascript·ecmascript
Wang's Blog31 分钟前
Go-Zero项目开发17: IM私聊功能实现与消息存储设计
开发语言·后端·golang
Ulyanov35 分钟前
Python雷达电子对抗仿真引擎(一):打破单体瓶颈,构建微服务与ECS架构的顶层设计
开发语言·python·微服务·云原生·架构·雷达电子对抗
IT方大同38 分钟前
C语言分支与循环语句
c语言·开发语言·算法
长不胖的路人甲1 小时前
斐波那契查找Java 实现 + 完整思路
java·开发语言
星恒随风1 小时前
C++ 继承进阶:默认成员函数、多继承、虚继承与组合设计
开发语言·c++·笔记·学习
Yeauty1 小时前
用 Whisper 转录前,你不用再离开 Rust
开发语言·rust·ffmpeg·音视频·视频
电子云与长程纠缠1 小时前
UE中使用TGuardValue与TInlineComponentArray数据结构
开发语言·数据结构·学习·ue5·游戏引擎
呜喵王阿尔萨斯2 小时前
C/C++ const -- 多义混乱
c语言·开发语言·c++
__log2 小时前
幂等性设计:从“重复提交“到“稳如磐石“的系统防护
java·开发语言·spring boot