0

0

Go语言结构体初始化:new()、{} 与 &T{} 的选择与实践

花韻仙語

花韻仙語

发布时间:2025-11-26 13:32:36

|

571人浏览过

|

来源于php中文网

原创

go语言结构体初始化:new()、{} 与 &t{} 的选择与实践

本文深入探讨Go语言中结构体的三种主要初始化方式:`new()`、`{}` 字面量以及 `&T{}`。我们将分析它们各自的特点、返回类型和适用场景,重点阐述在何种情况下应选择哪种方式,例如当结构体字段需逐步填充时使用 `new()`,而当所有字段在创建时已知时则倾向于使用 `{}` 或 `&T{}`,旨在帮助开发者做出更明智的初始化决策。

理解Go语言结构体的初始化方式

在Go语言中,结构体(struct)的初始化有多种方式,每种方式都有其特定的语义和适用场景。理解这些差异对于编写清晰、高效且符合Go惯用法的代码至关重要。

1. 使用 new() 关键字

new() 是Go语言的一个内置函数,它接受一个类型作为参数,并返回一个指向该类型零值的指针。对于结构体而言,new(T) 会分配足够的内存来存储一个 T 类型的零值,并返回一个 *T 类型的指针。所有字段都会被初始化为其各自类型的零值(例如,数值类型为0,字符串为空字符串"",布尔类型为false,指针为nil)。

示例代码:

立即学习go语言免费学习笔记(深入)”;

AdMaker AI
AdMaker AI

从0到爆款高转化AI广告生成器

下载
package main

import "fmt"

type User struct {
    Name  string
    Age   int
    Email string
}

func main() {
    // 使用 new() 初始化 User 结构体
    userPtr := new(User) // userPtr 是一个 *User 类型,指向 User 的零值
    fmt.Printf("new(User) 初始化结果: %+v\n", userPtr) // 输出: &{Name: Age:0 Email:}

    // 可以通过指针访问并修改字段
    userPtr.Name = "Alice"
    userPtr.Age = 30
    userPtr.Email = "alice@example.com"
    fmt.Printf("修改后的 userPtr: %+v\n", userPtr) // 输出: &{Name:Alice Age:30 Email:alice@example.com}
}

特点:

  • 始终返回一个指向零值的指针(*T)。
  • 在初始化时不会为字段赋值,所有字段均为其类型的零值。

2. 使用 {} 字面量(复合字面量)

{} 字面量是Go语言中最常见的结构体初始化方式,它允许我们直接创建结构体的值,并可以选择性地为字段赋值。

创建结构体值:T{}

这种方式创建的是一个结构体值(T 类型),而不是指针。可以按字段顺序或通过字段名来初始化。

示例代码:

立即学习go语言免费学习笔记(深入)”;

package main

import "fmt"

type User struct {
    Name  string
    Age   int
    Email string
}

func main() {
    // 完整初始化(按字段顺序,不推荐,易出错)
    user1 := User{"Bob", 25, "bob@example.com"}
    fmt.Printf("User1 (按顺序): %+v\n", user1) // 输出: {Name:Bob Age:25 Email:bob@example.com}

    // 推荐的初始化方式(通过字段名)
    user2 := User{
        Name:  "Charlie",
        Age:   35,
        Email: "charlie@example.com",
    }
    fmt.Printf("User2 (按字段名): %+v\n", user2) // 输出: {Name:Charlie Age:35 Email:charlie@example.com}

    // 部分初始化,未指定的字段为零值
    user3 := User{Name: "David"}
    fmt.Printf("User3 (部分初始化): %+v\n", user3) // 输出: {Name:David Age:0 Email:}
}

特点:

  • 返回一个结构体值(T)。
  • 允许在创建时直接为字段赋值。
  • 未显式赋值的字段将自动初始化为零值。

3. 使用 &T{} 复合字面量取地址

&T{} 结合了 {} 字面量的初始化能力和 new() 返回指针的特性。它会创建一个结构体值,然后立即返回该值的地址。这意味着你可以在创建时直接初始化字段,但最终得到的是一个指向该结构体值的指针(*T)。

示例代码:

立即学习go语言免费学习笔记(深入)”;

package main

import "fmt"

type User struct {
    Name  string
    Age   int
    Email string
}

func main() {
    // 使用 &T{} 初始化并获取指针
    userPtrWithValues := &User{
        Name:  "Eve",
        Age:   40,
        Email: "eve@example.com",
    }
    fmt.Printf("&User{} 初始化结果: %+v\n", userPtrWithValues) // 输出: &{Name:Eve Age:40 Email:eve@example.com}

    // 同样可以部分初始化
    partialUserPtr := &User{Name: "Frank"}
    fmt.Printf("部分初始化 &User{}: %+v\n", partialUserPtr) // 输出: &{Name:Frank Age:0 Email:}
}

特点:

  • 返回一个指向结构体值的指针(*T)。
  • 允许在创建时直接为字段赋值,未赋值字段为零值。
  • 这种语法不仅适用于结构体,也适用于数组、切片和映射类型,用于获取它们的地址。

何时选择哪种方式?

选择哪种初始化方式,主要取决于你的具体需求:是需要一个零值指针,一个带初始值的结构体值,还是一个带初始值的结构体指针。

1. 倾向于使用 {} 或 T{} 的场景

当你希望创建一个结构体值,并且在创建时就能确定所有或大部分字段的值时,T{} 是最直接、最清晰的选择。

  • 已知所有字段值:如果结构体的所有字段值在声明时都是确定的,使用 {} 进行完整初始化可以提高代码的可读性。
  • 需要值类型:当你需要一个结构体的值副本,而不是其指针时。例如,将结构体作为函数参数按值传递,或将其存储在切片、数组中作为值。
  • 短生命周期对象:对于只在局部作用域内使用的临时结构体对象,通常直接创建值类型更为简洁。

示例:

import "time"

type Config struct {
    Host    string
    Port    int
    Timeout time.Duration
}

func processConfig(cfg Config) {
    // 处理配置
    fmt.Printf("处理配置: %+v\n", cfg)
}

func main() {
    // 创建一个完整的配置对象
    config := Config{
        Host: "localhost",
        Port: 8080,
        Timeout: 30 * time.Second,
    }

    // 作为函数参数传递值
    processConfig(config)
}

2. 倾向于使用 new(T) 的场景

当你需要一个指向结构体零值的指针,并且其字段将会在后续操作中逐步填充时,new(T) 是一个合适的选择。

  • 逐步填充字段:当结构体的字段值需要通过多次操作(例如,从数据库加载、解析JSON/XML、用户输入)才能完全确定时。
  • 需要零值指针:如果你的函数或方法期望接收一个指向零值结构体的指针作为输入,new(T) 可以满足这个要求。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

411

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1879

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2085

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1006

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

257

2023.08.03

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号