新闻中心
Go语言结构体初始化:new() 与 {} 的选择策略与实践

在go语言中,初始化结构体主要有两种方式:使用`new()`函数或字面量`{}`。`new()`函数返回一个指向零值结构体的指针,适用于需要逐步填充字段或仅需一个零值指针的场景。而`{}`字面量则用于创建结构体的值类型,或者通过`&t{}`语法创建指向已初始化结构体的指针,这在结构体字段值在初始化时已知的情况下更为常见和推荐。理解这两种方法的特性与适用场景,是编写高效go代码的关键。
Go语言结构体初始化方法概述
Go语言提供了灵活的结构体初始化机制,允许开发者根据具体需求选择最合适的方式。核心上,我们有两种主要途径来创建一个结构体实例:
- 使用 new() 函数: new(Type) 返回一个指向 Type 类型零值的指针。
- 使用结构体字面量 {}: Type{} 创建一个 Type 类型的零值或已初始化的值。通过 &Type{} 可以直接创建并返回一个指向已初始化结构体的指针。
理解这两种方法返回值的类型(值或指针)以及它们的初始化状态(零值或指定值)是做出正确选择的基础。
结构体字面量 {} 初始化
结构体字面量初始化是最常用且推荐的方式,因为它允许在创建实例时直接指定字段的值。
1. 初始化为值类型
当您需要一个结构体的值类型实例时,可以直接使用 Type{} 语法。您可以选择初始化所有字段、部分字段,或者不初始化任何字段(此时所有字段将被初始化为其零值)。
package main
import "fmt"
type Person struct {
Name string
Age int
City string
}
func main() {
// 初始化所有字段
p1 := Person{Name: "Alice", Age: 30, City: "New York"}
fmt.Printf("p1: %+v, Type: %T\n", p1, p1) // p1: {Name:Alice Age:30 City:New York}, Type: main.Person
// 初始化部分字段,未指定的字段为零值
p2 := Person{Name: "Bob", Age: 25}
fmt.Printf("p2: %+v, Type: %T\n", p2, p2) // p2: {Name:Bob Age:25 City:}, Type: main.Person
// 初始化为零值结构体
p3 := Person{}
fmt.Printf("p3: %+v, Type: %T\n", p3, p3) // p3: {Name: Age:0 City:}, Type: main.Person
// 字段顺序初始化(不推荐,易出错)
p4 := Person{"Charlie", 35, "London"}
fmt.Printf("p4: %+v, Type: %T\n", p4, p4) // p4: {Name:Charlie Age:35 City:London}, Type: main.Person
}注意事项:
Motiff妙多
Motiff妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”
334
查看详情
- 使用 字段名: 值 的形式进行初始化是最佳实践,即使字段顺序改变,代码依然健壮。
- 未显式初始化的字段将自动设置为其类型的零值(例如,string 为 "",int 为 0,指针为 nil)。
2. 初始化为指针类型 (&T{})
当您需要一个指向结构体的指针,并且希望在创建时就初始化其字段时,可以使用 &Type{} 语法。这在Go语言中非常常见,因为它结合了创建指针和初始化字段的便利性。
package main
import "fmt"
type Product struct {
ID string
Name string
Price float64
}
func main() {
// 创建并初始化一个指向Product结构体的指针
prod1 := &Product{ID: "P001", Name: "Laptop", Price: 1200.0}
fmt.Printf("prod1: %+v, Type: %T\n", prod1, prod1) // prod1: &{ID:P001 Name:Laptop Price:1200}, Type: *main.Product
// 创建一个指向零值Product结构体的指针
prod2 := &Product{}
fmt.Printf("prod2: %+v, Type: %T\n", prod2, prod2) // prod2: &{ID: Name: Price:0}, Type: *main.Product
}注意事项:
- &Type{} 语法不仅适用于结构体,也适用于数组、切片和映射类型,用于获取它们的地址。
- 这种方式在需要将结构体作为函数参数传递指针,或者需要修改原始结构体实例时非常有用。
new() 函数初始化
new(Type) 函数分配内存并返回一个指向该类型零值的指针。它的主要特点是:
- 返回指针: 始终返回一个指针。
- 零值初始化: 分配的内存会被清零,因此所有字段都会被初始化为其类型的零值。
package main
import "fmt"
type User struct {
ID int
Email string
Active bool
}
func main() {
// 使用 new() 初始化一个指向User结构体零值的指针
userPtr := new(User)
fmt.Printf("userPtr: %+v, Type: %T\n", userPtr, userPtr) // userPtr: &{ID:0 Email: Active:false}, Type: *main.User
// 之后可以逐步填充字段
userPtr.ID = 101
userPtr.Email = "test@example.com"
userPtr.Active = true
fmt.Printf("userPtr (after population): %+v\n", userPtr) // userPtr (after population): &{ID:101 Email:test@example.com Active:true}
}new() 与 {} 的选择策略
何时使用 new(),何时使用 {}(包括 &T{})取决于您的具体需求和编码习惯。
-
当结构体的完整值在初始化时已知时,优先使用 {} 或 &T{}。
- 如果您需要一个结构体的值类型:myStruct := MyStruct{Field1: value1, Field2: value2}
- 如果您需要一个指向已初始化结构体的指针:myStructPtr := &MyStruct{Field1: value1, Field2: value2}
- 这种方式代码更简洁,意图更明确,因为它在创建时就完成了初始化。
-
当结构体字段需要逐步填充,或者您仅需要一个指向零值结构体的指针时,使用 new()。
- 例如,您可能从不同的来源获取字段数据,或者在循环中逐步构建一个复杂的结构体。
- myStructPtr := new(MyStruct)
- myStructPtr.Field1 = fetchedValue1
- myStructPtr.Field2 = fetchedValue2
- 尽管如此,即使是逐步填充,许多Go开发者也倾向于先使用 &MyStruct{} 创建一个零值指针,然后填充,因为 &T{} 语法更具一致性。
-
Go语言的惯用风格:
- 在Go语言中,&T{} 是获取一个指向结构体指针的非常常见且推荐的方式,因为它允许您在同一行代码中完成内存分配、零值初始化(对于未指定的字段)和指定字段的初始化。
- new(T) 的使用相对较少,主要在确实只需要一个零值指针,并且不需要在创建时指定任何字段值的情况下。
总结
- Type{}: 创建一个结构体值类型。可初始化字段,未初始化字段为零值。
- &Type{}: 创建一个指向结构体的指针,并允许在创建时初始化字段。未初始化字段为零值。这是获取已初始化结构体指针的常用且推荐方式。
- new(Type): 创建一个指向结构体零值的指针。所有字段都为零值。适用于需要逐步填充或仅需零值指针的场景。
在大多数情况下,当您需要一个结构体实例并知道其初始值时,使用 {} 或 &{} 语法会使代码更清晰、更符合Go语言的惯例。new() 则在特定场景下提供了一种获取零值指针的直接方式。理解它们之间的细微差别,将有助于您编写出更地道、更高效的Go代码。
以上就是Go语言结构体初始化:new() 与 {} 的选择策略与实践的详细内容,更多请关注其它相关文章!
# 这在
# 建瓯seo排名
# 河源网络营销推广招聘
# seo品牌优化百度资源网站推广关键词排名
# 正安全网营销推广
# 广州网络营销推广方案
# 高端网站建设论文题目
# 框架技术快排seo外包
# 日照软文营销推广
# 俄语网站建设工作总结
# 唐海抖音seo定做公司
# 有两种
# go
# 时就
# 可以直接
# 当您
# 因为它
# 为其
# 为零
# 适用于
# 创建一个
# ai
# 编码
# go语言
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
抖音极速版最新版本 抖音极速版官方下载地址
TikTok国际版官网直达_TikTok国际版官网直达进入在线观看
R星幕后开发视频泄露 包含《GTA6》等多款大作
Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
Tailwind CSS line-clamp 布局问题解析与修复指南
如何在 Windows 11 中启动游戏手柄设置
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
Lar*el头像管理:图片缩放与旧文件删除的最佳实践
Pandas DataFrame:高效添加条件计算列
QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口
12306选座系统怎么选连座_12306选座多人连坐操作方法
Golang如何优雅处理error_Golang error处理最佳实践总结
C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用
新手怎么开始学化妆 零基础化妆入门教程
Lar*el递归关系中排除子孙节点的策略
sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统
Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】
学习通网页版官方登录 超星学习通电脑端入口指南
React/Next.js中实现列表项的动态选择与移动
汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口
如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
Go语言JSON解析深度指南:动态访问与结构体映射实践
Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法
mc.js游戏直达 mc.js网页免下载版本秒进地址
漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接
Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】
KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明
蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】
汽水音乐网页版使用入口_汽水音乐电脑版播放指南
淘宝网网页版登录入口 淘宝官方网页版快捷登录
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!
J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】
Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐
QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口
Golang指针如何与map组合使用_Golang map指针组合实践
千牛数据看板网页版_千牛数据看板网页版访问方法
word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法
Win11怎么修改默认浏览器_Windows 11设置Chrome为默认
AO3访问入口汇总 AO3网页版同人作品一键直达


2025-11-26
浏览次数:次
返回列表