前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >struct结构体类型2 - 嵌入结构体值 指针类型区别

struct结构体类型2 - 嵌入结构体值 指针类型区别

作者头像
HHTjim 部落格
发布2023-10-18 16:54:15
1770
发布2023-10-18 16:54:15
举报
文章被收录于专栏:HHTjim'S 部落格HHTjim'S 部落格

struct结构体类型2 - 嵌入结构体值 指针类型区别

作者:matrix 被围观: 316 次 发布时间:2023-07-07 分类:Golang | 3 条评论 »

Golang中嵌入结构体类型有两种:值或指针

结论

创建 含内嵌指针struct实例时,必须手动声明嵌入的结构指针。

伪代码如下:

代码语言:javascript
复制
package main
type BaseDao struct{name string}

# 匿名结构体字段BaseDao 
type OptDao1 struct{BaseDao} # 嵌入值
type OptDao2 struct{*BaseDao} # 嵌入指针

func main(){
  opt := OptDao2{BaseDao:&BaseDao{}} //必须手动声明嵌入的结构指针
}

上面代码中OptDao1、OptDao2嵌入了BaseDao结构体,主要区别只有嵌入值的类型不同。值和指针区别

嵌入值

创建OptDao1对象

代码语言:javascript
复制
mOptDao1 := OptDao1{}
mOptDao1.name 

代码调用会正常,属性name会获取到空字符串

其他例:

代码语言:javascript
复制
type Base struct {
    value int
}

func (b *Base) Increase() {
    b.value++
}

type Derived struct {
    Base
}

func main() {
    d := Derived{}
    d.Increase()
    fmt.Println(d.value) // 输出 1
}

嵌入指针

创建OptDao2对象

代码语言:javascript
复制
mOptDao2 := OptDao2{}
mOptDao2.name 

上面代码调用会出现nil空指针异常,runtime error: invalid memory address or nil pointer dereference,即nil指针解引用错误。

原因是访问一个nil对象的方法或属性,这就会panic。

怎么办?

代码语言:javascript
复制
mOptDao2 := OptDao2{BaseDao:&BaseDao{}}
mOptDao2.name 

创建mOptDao2实例时必须声明嵌入的结构指针

其他例:

代码语言:javascript
复制
type Base struct {
    value int
}

func (b *Base) Increase() {
    b.value++
}

type Derived struct {
    *Base
}

func main() {
    d := Derived{Base: &Base{}}
    d.Increase()
    fmt.Println(d.value) // 输出 1
}

简而言之,选择值类型嵌入还是指针类型嵌入,主要取决于你是否需要多个实例共享同一个嵌入实例的状态。如果你需要共享状态,使用指针类型嵌入。如果你不需要共享状态,使用值类型嵌入。

一般情况下选择嵌入值即可,除非多个对象需要共享一个Base结构实例。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-07-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • struct结构体类型2 - 嵌入结构体值 指针类型区别
    • 结论
      • 嵌入值
        • 嵌入指针
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档