Golang结构体初始化问题探讨
Golang结构体初始化问题探讨 我定义了一个结构体类型,并像下面这样将变量分配给该类型:
package main
import (
"fmt"
)
type Student struct {
rollNumber int
Name string
subject string
}
var student Student
func main() {
student.Name = "siddhanta"
fmt.Println(student.Name)
}
按理说应该会报错,因为 student 变量尚未初始化。但它却正确输出了 siddhanta。
我的问题是:Go 是否隐式地将 student 变量初始化为空结构体,就像 student = Student{} 那样?
更多关于Golang结构体初始化问题探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html
func main() {
fmt.Println("hello world")
}
感谢 @calmh
是的。Go 语言中的每个变量如果没有显式初始化为其他值,都会被隐式赋予零值。
但是 student 变量是结构体类型,而不是像 int 或 string 这样的基本类型变量。
那么它是如何隐式初始化为零值的呢? 所以在 Go 中我们永远不需要初始化空结构体吗?
正如相关规范所述,初始化是递归进行的。结构体的所有成员都会获得其类型的零值。您无需显式地将结构体初始化为任何特定值。
事实上,最佳实践是让结构体的零值在无需任何初始化的情况下即可正常使用。以 bytes.Buffer 为例:
var buf bytes.Buffer
fmt.Fprintln(&buf, "hello")
这种方式完全可行且效果良好。
是的,你的理解是正确的。在Go语言中,当你声明一个结构体类型的变量但没有显式初始化时,Go会自动将其初始化为该类型的零值。对于结构体类型,零值意味着所有字段都被设置为它们各自类型的零值。
在你的代码中:
var student Student
这行代码声明了一个Student类型的变量student,Go会隐式地将其初始化为Student{},相当于:
var student Student = Student{}
这意味着:
rollNumber字段被初始化为0(int的零值)Name字段被初始化为""(string的零值)subject字段被初始化为""(string的零值)
然后当你执行:
student.Name = "siddhanta"
你只是修改了已经存在的结构体实例的Name字段,所以程序能够正常运行并输出"siddhanta"。
这里有一个更完整的示例来演示结构体的零值初始化:
package main
import "fmt"
type Student struct {
rollNumber int
Name string
subject string
}
func main() {
var student1 Student // 隐式初始化为零值
fmt.Printf("student1: %+v\n", student1)
student2 := Student{} // 显式初始化为零值
fmt.Printf("student2: %+v\n", student2)
// 两者是等价的
fmt.Printf("student1 == student2: %t\n", student1 == student2)
// 修改字段值
student1.Name = "siddhanta"
student1.rollNumber = 101
fmt.Printf("修改后的student1: %+v\n", student1)
}
输出结果:
student1: {rollNumber:0 Name: subject:}
student2: {rollNumber:0 Name: subject:}
student1 == student2: true
修改后的student1: {rollNumber:101 Name:siddhanta subject:}
这种自动零值初始化的特性是Go语言设计的一部分,它确保了变量在使用前总是有一个确定的值,避免了未定义行为。

