news 2026/7/15 4:37:24

结构体与方法——面向对象的Go式实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
结构体与方法——面向对象的Go式实现

Go 语言没有 class,但它通过结构体(struct) + 方法(method) + 接口(interface)这套组合,实现了一种非常务实、轻量级的面向对象风格

下面从最基础讲起,一步步说明 Go 是如何“面向对象”的(重点放在结构体与方法的部分)。

1. 结构体 ≈ 数据 + 状态(类似 OOP 的“字段/属性”)

typePersonstruct{NamestringAgeintGenderstring// 小写开头 → 包外不可见(封装)}
  • 这是最基本的“对象数据载体”
  • Go 不强制要求字段一定要小写(private),但习惯上用小写开头实现封装

2. 方法 = 绑定到结构体的函数(Receiver)

Go 的方法写法非常独特:函数名前加一个“接收者”参数

// 值接收者(最常见,拷贝一份数据)func(p Person)Greet()string{return"你好,我是 "+p.Name}// 指针接收者(能修改原对象)func(p*Person)Birthday(){p.Age++// 真正修改了调用者的 Age}

使用方式:

funcmain(){alice:=Person{Name:"Alice",Age:25}// 值接收者:两种写法都行,Go 会自动解引用fmt.Println(alice.Greet())// 你好,我是 Alicefmt.Println((&alice).Greet())// 也行// 指针接收者:通常需要 & 取地址alice.Birthday()// Age 变成 26(&alice).Birthday()// 也行fmt.Println(alice.Age)// 27}

3.值接收者 vs 指针接收者 —— 这是 Go 最容易踩坑的地方

特性值接收者(p Person)指针接收者(p *Person)推荐场景
是否拷贝结构体是(拷贝一份)否(只拷贝指针,8字节)
能否修改原对象不能(改的是副本)需要修改状态时必须用指针
方法调用方式值 / 指针 都可以调用只有指针能调用(值调用会编译错)
并发安全性天然安全(操作副本)需要自己加锁小结构体、无状态变化 → 值接收者
性能(大结构体)拷贝开销大几乎无拷贝开销结构体 > 几十字节 → 优先考虑指针
一致性原则(官方建议)同一个类型的所有方法尽量统一用一种接收者

官方经典建议(Effective Go & Go Tour)

“对一个类型的所有方法,要么都用值接收者,要么都用指针接收者,不要混用。”

最常见的现实选择规律(2025–2026 社区共识)

4. 完整的“类”风格示例(带构造函数 + 方法)

packagemainimport"fmt"// "类":推荐首字母大写(导出)typeRectanglestruct{widthfloat64heightfloat64}// 构造函数(Go 没有 new 关键字强制要求,习惯用 NewXxx)funcNewRectangle(w,hfloat64)*Rectangle{ifw<=0||h<=0{panic("宽度和高度必须 > 0")}return&Rectangle{width:w,height:h}}// 值接收者方法(只读)func(r Rectangle)Area()float64{returnr.width*r.height}func(r Rectangle)Perimeter()float64{return2*(r.width+r.height)}// 指针接收者方法(修改状态)func(r*Rectangle)Scale(factorfloat64){r.width*=factor r.height*=factor}// 实现 Stringer 接口(类似 toString)func(r Rectangle)String()string{returnfmt.Sprintf("Rectangle{%.1f × %.1f}",r.width,r.height)}funcmain(){rect:=NewRectangle(10,5)fmt.Println(rect)// Rectangle{10.0 × 5.0}fmt.Printf("面积: %.2f\n",rect.Area())// 50.00rect.Scale(2)fmt.Println(rect)// Rectangle{20.0 × 10.0}fmt.Printf("周长: %.2f\n",rect.Perimeter())// 60.00}

5. Go 的 OOP 与传统语言对比(快速记忆表)

特性Java/C#/C++GoGo 的实现方式
classstruct
构造器constructor普通函数(NewXxx)习惯约定
方法member functionreceiver function(t T) 或 (t *T)
继承extends不支持,改用嵌入匿名嵌入结构体
多态override接口(duck typing)隐式实现接口
封装private/protected小写字段/方法包级可见性
this/selfthis / self接收者名字(习惯用 p、r、this)随便起名

总结一句话:

Go 的“面向对象”本质是:用 struct 存数据,用方法(带 receiver)绑行为,用接口做多态,用嵌入做组合/“伪继承”

故意去掉了传统 OOP 最复杂、最容易滥用的部分(类继承、protected、super、构造器链、final 等),换来的是更简单、可预测、高性能的代码。

你现在是用值接收者多一些,还是指针接收者占主流?
或者你在项目里遇到过最纠结的 receiver 选择场景是什么?可以聊聊~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/11 3:54:30

大模型本地部署:Windows PC上从零开始部署ChatGML-6B-int4量化模型

ChatGLM-6B是清华大学知识工程和数据挖掘小组&#xff08;Knowledge Engineering Group (KEG) & Data Mining at Tsinghua University&#xff09;发布的一个开源的对话机器人。6B表示这是ChatGLM模型的60亿参数的小规模版本&#xff0c;约60亿参数。 ChatGML-6B-int4量化…

作者头像 李华
网站建设 2026/7/1 10:14:28

资深AI技术专家20年总结,零AI基础掌握大模型、扩散模型、多模态模型

今天给大家系统地介绍了一本AIGC的各方面内容的书—《AIGC原理与实践&#xff1a;零基础学大语言模型、扩散模型和多模态模型》&#xff0c;这本书从基础知识到应用实践&#xff0c;从基本原理到案例分析&#xff0c;力求通过简洁明了的语言、清晰生动的例子&#xff0c;引导读…

作者头像 李华
网站建设 2026/7/14 1:55:43

Nginx:如何安装Nginx详细教程(总结一)

一、Nginx简介 1. 什么是Nginx Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发&#xff0c;官方测试nginx能够支支撑5万并发链接&#xff0c;并且cpu、内存等资源消耗却非常低&…

作者头像 李华
网站建设 2026/7/1 17:54:37

零基础入门 Spring Boot:从‘Hello World’到可上线的 Web 应用

零基础入门 Spring Boot&#xff1a;从‘Hello World’到可上线的 Web 应用 &#x1f4a1; 适合谁&#xff1f; 完全没写过 Java Web 的新手&#xff0c;会安装软件、能看懂基础代码&#xff08;如 System.out.println&#xff09;&#xff0c;想快速上手一个真实可用的后端框架…

作者头像 李华
网站建设 2026/7/1 10:14:35

2026年小众但好用的免费开源项目管理软件Top10深度推荐

在当今快速发展的数字时代&#xff0c;项目管理软件成为了各类企业和团队不可或缺的工具。随着对高效、灵活且成本可控的需求增加&#xff0c;越来越多的小众开源项目管理软件进入市场&#xff0c;提供了多样化的选择。本篇文章将为您推荐2026年值得关注的十大免费开源项目管理…

作者头像 李华