如何在 Go 中正确创建并返回结构体实例


在 go 中,不应在方法内创建新对象却不返回它,这会导致内存浪费和逻辑混乱;推荐使用独立的构造函数(如 newxxx)来初始化并返回结构体指针。

Go 语言强调清晰、高效与显式语义。你提供的代码中,CreateObject() 方法在接收者 *SelfInitialisator 的上下文中新建了一个 SelfInitialisator 实例,但既未返回该实例,也未将其赋值给任何外部变量——这意味着该对象在方法作用域结束时即被垃圾回收,完全无实际用途,属于典型的“创建即丢弃”反模式。

✅ 正确做法:使用命名构造函数(Factory Function),例如 NewSelfInitialisator():

func NewSelfInitialisator() *SelfInitialisator {
    s := new(SelfInitialisator)
    s.Fields1 = "Hello"
    s.Fields2 = "Foo"
    return s
}

调用方式简洁明确:

s := NewSelfInitialisator()
s.Method1() // 输出: Hello Foo

? 补充建议:

  • 构造函数名遵循 Go 惯例:以 New 开头,首字母大写(导出),清晰表明其职责是创建并返回新实例;
  • 若需可选初始化参数(如自定义字段值),可扩展为:
    func NewSelfInitialisator(f1, f2 string) *SelfInitialisator {
        return &SelfInitialisator{Fields1: f1, Fields2: f2}
    }
  • 避免在方法中 new(T) 或 &T{} 后不返回或不关联到状态——除非是内部缓存、日志临时对象等有明确生命周期管理的场景。

总结:Go 不支持传统意义上的“构造方法”,而是通过普通函数实现对象创建。将初始化逻辑集中于 NewXXX 函数,既符合语言哲学,也提升代码可读性、可测试性与复用性。


# go  # 作用域  # 代码可读性  # 构造函数  # 结构体  # 指针  # function  # 对象  # 推荐使用  # 将其  # 自定义  # 不支持  # 可选  # 应在  # 这会  # 也未  # 结束时  # 或不 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  如何在Golang中处理云原生事件_使用Event和Notification机制  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  Python文件管理规范_工程实践说明【指导】  Win11开始菜单打不开_修复Windows 11点击开始图标无响应【教程】  Win11蓝牙开关不见了怎么办_Win11蓝牙驱动丢失修复教程【方法】  如何使用Golang实现容器健康检查_监控和自动重启  Golang如何遍历目录文件_Golang filepath.Walk目录遍历操作方法  Win11怎么查看已连接wifi密码 Win11查已连wifi密码步骤【教程】  如何在JavaScript中动态拼接PHP的base_url与jQuery变量  php串口通信波特率怎么选_根据硬件手册设置正确波特率【方法】  如何使用Golang构建基础消息队列模拟_Golang消息发送与消费实现方法  Win10系统怎么查看网络连接状态_Windows10网络和共享中心  Win11怎么更改鼠标指针方案_Windows11自定义鼠标光标样式与大小  PythonWeb前后端整合项目教程_FastAPIReact完整实例  如何使用Golang管理模块版本_Golanggo mod tidy与升级方法  Win11时间怎么同步到原子钟 Win11高精度时间同步设置【指南】  Win11怎么关闭右下角弹窗_Win11拦截系统通知广告【设置】  Windows怎样关闭开始菜单推荐广告_Windows关闭开始菜单推荐设置【步骤】  如何在 Go 中调用动态链接库(.so)中的函数  c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】  Python 模块的 __name__ 属性如何由导入方式决定?  Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录  Win11怎么关闭防火墙通知_屏蔽Win11安全中心安全警告弹窗【技巧】  C#如何使用XPathNavigator高效查询XML  如何使用Golang操作指针变量_Golang解引用与赋值实践  Windows10如何重置此电脑_Windows10电脑重置方法【步骤】  c++如何用AFL++进行模糊测试 c++ Fuzzing入门【安全】  Win11如何暂停系统更新 Win11暂停更新最长时限设置【步骤】  如何使用Golang实现聊天室消息存档_存储聊天记录到文件  Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  Win11声音太小怎么办_Windows 11开启响度均衡增强音量【技巧】  静态属性修改会影响所有实例吗_php作用域操作符下静态存储【教程】  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  如何使用Golang搭建Web开发环境_快速启动HTTP服务  php中常量能用::访问吗_类常量与作用域操作符使用场景【汇总】  Win11怎么关闭搜索历史_Win11清除设备上的搜索历史记录  C#如何序列化对象为XML XmlSerializer用法  Python网络日志追踪_请求定位解析【教程】  如何在Golang中捕获HTTP服务器错误_GolangHTTP Handler中error处理  如何使用Golang实现负载均衡_分发请求到多个服务节点  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  php8.4如何调用com组件_php8.4windows下com操作指南【教程】  Python变量绑定机制_引用模型解析【教程】  Win11怎么关闭搜索历史 Win11清除搜索框最近记录【隐私】  如何在Windows中创建新的用户账户?(标准与管理员)  Windows10电脑怎么设置文件权限_Win10安全选项卡所有者修改  VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】  Golang如何测试HTTP中间件_Golang HTTP中间件功能测试实践 

 2026-01-05

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.