没有 class 和继承,Go 怎么写业务?struct + 组合实战
本文为《Java工程师转Go实战》连载第 5 篇 / 共 20 篇上一篇指针与内存模型下一篇从 Java interface 到 Go 鸭子类型类比开场Java 写业务class OrderService extends BaseService层层继承。Go 的态度组合优于继承。没有extends用struct 嵌套embedding复用能力。一、用 struct 表达领域对象JavapublicclassOrder{privateLongid;privateBigDecimalamount;privateListOrderItemitems;// getter/setter...}GotypeOrderItemstruct{SKUstringPriceint64// 分避免 float 金额}typeOrderstruct{IDint64Amountint64Items[]OrderItem}没有 getter/setter 强迫症同包内直接访问字段跨包用首字母大小写控制导出。二、用组合代替继承Java 继承publicclassBaseEntity{protectedLocalDateTimecreatedAt;protectedLocalDateTimeupdatedAt;}publicclassUserextendsBaseEntity{privateStringname;}Go 嵌入typeTimestampsstruct{CreatedAt time.Time UpdatedAt time.Time}typeUserstruct{Timestamps// 匿名字段嵌入IDint64Namestring}funcmain(){u:User{Name:张三}u.CreatedAttime.Now()// 可直接访问嵌入字段}嵌入不是继承User不是Timestamps的子类型只是「自带这些字段和方法」。三、Service 层怎么写JavaSpringServicepublicclassUserService{AutowiredprivateUserRepositoryuserRepository;publicUsercreate(UserDTOdto){...}}Go手写依赖注入typeUserRepositoryinterface{Save(ctx context.Context,u*User)errorFindByID(ctx context.Context,idint64)(*User,error)}typeUserServicestruct{repo UserRepository}funcNewUserService(repo UserRepository)*UserService{returnUserService{repo:repo}}func(s*UserService)Create(ctx context.Context,namestring)(*User,error){u:User{Name:name,ID:time.Now().UnixNano()}iferr:s.repo.Save(ctx,u);err!nil{returnnil,err}returnu,nil}对照NewUserService≈ 构造器注入interface定义在 consumer 侧很常见第 6 篇细讲没有Autowired显式传依赖反而更清晰四、Builder 模式还要吗Java 里 LombokBuilder很香Go 常见写法typeServerConfigstruct{HoststringPortint}typeServerOptionfunc(*ServerConfig)funcWithPort(portint)ServerOption{returnfunc(c*ServerConfig){c.Portport}}funcNewServer(opts...ServerOption)*ServerConfig{cfg:ServerConfig{Host:0.0.0.0,Port:8080}for_,opt:rangeopts{opt(cfg)}returncfg}函数式 Option 在 Go 标准库和 gRPC 里非常常见。五、完整小例子订单创建packageorderimportcontexttypeOrderstruct{IDint64UserIDint64Amountint64}typeRepositoryinterface{Insert(ctx context.Context,o*Order)error}typeServicestruct{repo Repository}funcNewService(repo Repository)*Service{returnService{repo:repo}}func(s*Service)PlaceOrder(ctx context.Context,userID,amountint64)(*Order,error){ifamount0{returnnil,ErrInvalidAmount}o:Order{UserID:userID,Amount:amount,ID:generateID()}iferr:s.repo.Insert(ctx,o);err!nil{returnnil,err}returno,nil}测试时Repository换 mock 实现即可和 Java 里 mockUserRepository一样。 面试追问Go 有没有继承没有类型继承。用 struct embedding 复用字段和方法是组合不是 is-a 关系。embedding 后方法冲突怎么办外层显式定义同名方法覆盖调用时需写清outer.Inner.Method()。Go 怎么做 DDD 聚合根大 struct 包级私有字段小写 公开方法维护不变量和 Java 封装思路一致。 一句话总结别在 Go 里找 class——用 struct 建模、用 interface 抽象、用组合复用Spring 那套分层思维原样适用。建议标签GolangJava面向对象struct后端

相关新闻

MB SD Connect C5诊断工具实战测评与使用技巧

MB SD Connect C5诊断工具实战测评与使用技巧

1. 项目概述:MB SD Connect C5诊断工具实战验证作为一名在汽车电子诊断领域摸爬滚打十年的老手,最近终于有机会深度测试这款传说中的MB SD Connect C5诊断设备。说实话,在拿到设备前我内心是存疑的——市面上号称能完美支持奔驰专检的设备太多…

2026/7/19 4:01:32阅读更多 →
嵌入式Linux GPIO-LED驱动开发与参数传递实战

嵌入式Linux GPIO-LED驱动开发与参数传递实战

1. GPIO-LED驱动开发实战在嵌入式Linux开发中,GPIO驱动是最基础也最常用的外设控制方式。今天我将分享一个完整的GPIO控制LED的驱动开发案例,这个案例来自我最近参与的工控设备项目。1.1 硬件连接与原理典型的LED驱动电路采用GPIO直接驱动方式&#xff0…

2026/7/19 4:01:32阅读更多 →
C# WinForms登录窗口实现与安全实践

C# WinForms登录窗口实现与安全实践

1. 登录窗口的基本实现思路在C# WinForms中创建一个登录窗口,本质上是在构建一个能够验证用户身份的表单界面。这个看似简单的功能背后,其实涉及几个关键设计决策:首先需要考虑的是应用程序的入口点设计。根据我多年的开发经验,主…

2026/7/19 3:59:32阅读更多 →
缠论不再难:ChanlunX插件如何让你在通达信中轻松看懂市场走势

缠论不再难:ChanlunX插件如何让你在通达信中轻松看懂市场走势

缠论不再难:ChanlunX插件如何让你在通达信中轻松看懂市场走势 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否曾经面对K线图感到迷茫?看着那些上下波动的线条,却…

2026/7/19 12:00:25阅读更多 →
UI-TARS桌面应用:5分钟快速上手,让AI帮你操控电脑的视觉语言模型

UI-TARS桌面应用:5分钟快速上手,让AI帮你操控电脑的视觉语言模型

UI-TARS桌面应用:5分钟快速上手,让AI帮你操控电脑的视觉语言模型 【免费下载链接】UI-TARS-desktop The Open-Source Multimodal AI Agent Stack: Connecting Cutting-Edge AI Models and Agent Infra 项目地址: https://gitcode.com/GitHub_Trending/…

2026/7/19 12:00:25阅读更多 →
突破智能家居编程瓶颈:Python自动化控制的3种实战解决方案

突破智能家居编程瓶颈:Python自动化控制的3种实战解决方案

突破智能家居编程瓶颈:Python自动化控制的3种实战解决方案 【免费下载链接】mijia-api 米家API,使用Python控制米家设备 项目地址: https://gitcode.com/gh_mirrors/mi/mijia-api 在传统APP控制无法满足个性化需求的今天,Python智能家…

2026/7/19 12:00:25阅读更多 →
如何快速掌握开源DICOM查看器:从零开始的完整医学影像处理指南

如何快速掌握开源DICOM查看器:从零开始的完整医学影像处理指南

如何快速掌握开源DICOM查看器:从零开始的完整医学影像处理指南 【免费下载链接】Weasis Weasis is a web-based DICOM viewer for advanced medical imaging and seamless PACS integration. 项目地址: https://gitcode.com/gh_mirrors/we/Weasis 想要免费获…

2026/7/19 12:00:25阅读更多 →
HTTPotion实战:构建自定义API客户端的5个技巧

HTTPotion实战:构建自定义API客户端的5个技巧

HTTPotion实战:构建自定义API客户端的5个技巧 【免费下载链接】httpotion [Deprecated because ibrowse is not maintained] HTTP client for Elixir (use Tesla please) 项目地址: https://gitcode.com/gh_mirrors/ht/httpotion HTTPotion是Elixir生态中一款…

2026/7/19 12:00:25阅读更多 →
Cordova插件开发指南:从选型到性能优化

Cordova插件开发指南:从选型到性能优化

1. Cordova插件生态全景解析 作为移动混合开发领域的常青树,Cordova通过插件机制实现了Web技术与原生功能的完美融合。根据Apache基金会2023年的统计数据,官方插件仓库收录的插件数量已突破3000个,涵盖设备API、UI组件、第三方服务集成等各个…

2026/7/19 11:58:25阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →