Golang 结构体与方法:面向对象编程入门与自定义类型

2次阅读

go通过结构体和方法实现面向对象编程,结构体封装数据,方法绑定行为;字段首字母大写控制导出,接收者分值类型指针类型,接口基于方法集实现多态

Golang 结构体与方法:面向对象编程入门与自定义类型

Go 语言没有传统意义上的类(class),但通过结构体(Struct)和方法(method)可以自然地实现面向对象编程的核心思想:封装、组合与行为绑定。关键在于理解 方法是绑定到特定类型的函数,而结构体就是最常用、最直观的自定义类型载体。

结构体:定义你的数据模板

结构体是一组字段的集合,用来描述某个实体的属性。它不带行为,只负责组织数据。

例如,定义一个用户信息结构体:

立即学习go语言免费学习笔记(深入)”;

type User struct {     Name  String     Age   int     Email string }

注意:字段首字母大写才对外部包可见(即“导出”),这是 Go 控制访问权限的方式,替代了 public/private 关键字。

创建实例有两种常见方式:

  • 字面量初始化(推荐,清晰明确):u := User{Name: "Alice", Age: 30}
  • new + 赋值(较少用):u := new(User); u.Name = "Alice"

方法:给类型添加行为

方法不是属于结构体的,而是属于某个具体类型(可以是结构体,也可以是其他类型如 int、[]string 等)。语法上,方法声明比函数多了一个接收者(receiver)部分。

例如,为 User 类型添加一个打招呼的方法:

立即学习go语言免费学习笔记(深入)”;

func (u User) Greet() string {     return "Hello, I'm " + u.Name }

这里 (u User) 就是值接收者,表示该方法操作的是 User 的副本;若想修改原值,应使用指针接收者:(u *User)

调用方式和普通函数不同,更像“对象调用方法”:u.Greet()。这种写法让代码语义更清晰,也支持方法链式调用(需返回自身或兼容类型)。

指针接收者 vs 值接收者:什么时候用哪个?

选择接收者类型不是随意的,它影响性能和语义:

  • 指针接收者 当你需要修改接收者本身,或结构体较大(避免拷贝开销)
  • 值接收者 当方法只读取字段,且结构体很小(如几个基本类型字段)
  • 如果某类型已有指针接收者方法,建议统一用指针接收者,避免混淆调用行为

小技巧:运行 go vet 会提示“method on … should have pointer receiver”,这是个实用的编码提醒。

接口与方法集:实现多态的关键

Go 的多态不靠继承,而靠接口(Interface)——一组方法签名的集合。只要某个类型实现了接口中所有方法,就自动满足该接口,无需显式声明。

例如定义一个可说话的接口:

立即学习go语言免费学习笔记(深入)”;

type Speaker interface {     Speak() string }

只要 User 类型有 Speak() string 方法,它就实现了 Speaker 接口,就能传给任何接受 Speaker 的函数。

这是 Go “鸭子类型”的体现:不看你是谁,只看你能不能做某事。它让代码更灵活、解耦更强,也天然支持组合优于继承的设计哲学。

text=ZqhQzanResources