没有 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后端

相关新闻

最新新闻

如何为你的团队制定设计原则:基于Awesome Design Principles的10个最佳实践

如何为你的团队制定设计原则:基于Awesome Design Principles的10个最佳实践

如何为你的团队制定设计原则:基于Awesome Design Principles的10个最佳实践 【免费下载链接】awesome-design-principles ✨ A curated list of awesome design principles 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-design-principles 设计原则…

2026/7/21 20:36:29
终极指南:如何用jQuery PowerTip解决网页提示框的3大痛点

终极指南:如何用jQuery PowerTip解决网页提示框的3大痛点

终极指南:如何用jQuery PowerTip解决网页提示框的3大痛点 【免费下载链接】jquery-powertip :speech_balloon: A jQuery plugin that creates hover tooltips. 项目地址: https://gitcode.com/gh_mirrors/jq/jquery-powertip 在网页开发中,提示框…

2026/7/21 20:36:29
WAF绕过实战:文件上传漏洞的5个冷门技巧与防御策略

WAF绕过实战:文件上传漏洞的5个冷门技巧与防御策略

1. 项目概述:为什么我们需要关注“冷门”的WAF绕过技巧?在安全测试和渗透测试的日常工作中,提到Web应用防火墙(WAF)绕过,很多人的第一反应往往是经典的SQL注入绕过:宽字节、注释符、大小写、编码…

2026/7/21 20:36:29
2026年主动权益基金市场分析与投资策略

2026年主动权益基金市场分析与投资策略

1. 2026上半年主动权益基金市场全景扫描 2026年上半年,A股市场走出了一轮波澜壮阔的结构性行情。在这个特殊的市场环境中,主动权益类基金的表现呈现出前所未有的分化格局。根据最新披露的基金半年报数据,全市场主动权益基金(包括普…

2026/7/21 20:36:29
现代军事科技与国防体系发展分析

现代军事科技与国防体系发展分析

1. 现代军事力量对比分析在当今国际格局下,各国军事力量的发展与平衡成为全球关注的焦点。作为一名长期关注国防建设的观察者,我认为有必要客观分析当前主要军事强国的实力对比情况。1.1 军事科技发展现状现代战争形态已发生深刻变革,信息化、…

2026/7/21 20:36:29
Qt模型/视图框架深度解析:从MVC对比到自定义Model实战

Qt模型/视图框架深度解析:从MVC对比到自定义Model实战

在 Qt 开发面试中,模型/视图(Model/View)框架是考察开发者对 Qt 核心架构理解深度的经典领域。很多开发者虽然用过 QTableView 、 QListView ,但当被问到“它和传统 MVC 有什么区别?”或“如何从零实现一个自定义 …

2026/7/21 20:31:29

月新闻