结构体指针声明定义的几种方式与区别
现有结构体 MyStruct
type MyStruct struct {
IntField int
StringField string
PtrField *int
}
import (
"fmt"
)
type MyStruct struct {
IntField int
StringField string
PtrField *int
}
func main() {
var myStruct *MyStruct // 结构体变量的零值
fmt.Printf("IntField: %d\n", myStruct.IntField)//输出0
fmt.Printf("StringField: %s\n", myStruct.StringField)//输出“”
fmt.Printf("PtrField: %v\n", myStruct.PtrField) // 指针字段的零值是 nil
fmt.Printf("myStruct:%v\n", &myStruct)//输出&{0 “” nil}
}
解释:var myStruct * MyStruct 是声明一个结构体变量并未初始化 所以myStruct会根据字段被设为默认值 {0 “” nil}
易错点
var myStruct *MyStruct // 声明结构体变量的指针
注意:此时myStruct是一个指针类型变量那么默认值为nil
那么接下来的代码运行到16行就会报空指针错误
package main
import (
"fmt"
)
type MyStruct struct {
IntField int
StringField string
PtrField *int
}
func main() {
var myStruct *MyStruct // 声明接口体变量空指针 myStruct = nil
fmt.Printf("IntField: %d\n", myStruct.IntField) //会报出myStruct空指针 nil不能调用内部属性 IntField
fmt.Printf("StringField: %s\n", myStruct.StringField)
fmt.Printf("PtrField: %v\n", myStruct.PtrF
}
所以我们要给结构体指针初始化
package main
import (
"fmt"
)
type MyStruct struct {
IntField int
StringField string
PtrField *int
}
func main() {
var myStruct *MyStruct // 声明结构体变量指针
myStruct = new(MyStuct)//给结构体变量指针 分配内存空间
fmt.Printf("IntField: %d\n", myStruct.IntField)//输出 0
fmt.Printf("StringField: %s\n", myStruct.StringField)//输出 “”
fmt.Printf("PtrField: %v\n", myStruct.PtrField) // 指针字段的零值是 nil
fmt.Printf("myStruct:%v\n", myStruct)//输出&{0 “” nil}
}
总结:
var name Type // 变量name为 Type的默认值
var name1 *Type //变量name1为Type类型的指针且默认值为nil
var name2 = new(Type) //变量name2为Type类型的指针并且已经初始化不为nil
个人推论: