go语言 声明结构体变量以及结构体指针的方法与区别

文章介绍了结构体`MyStruct`的指针声明方法,强调了在声明结构体指针时需要初始化以避免空指针错误。通过示例展示了未初始化和已初始化的指针在运行时的行为差异。
摘要由CSDN通过智能技术生成

结构体指针声明定义的几种方式与区别

现有结构体 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

个人推论:

                   
 ​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值