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

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

这是一个创建于 503 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

结论

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

伪代码如下:

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对象

mOptDao1 := OptDao1{}
mOptDao1.name 

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

其他例:

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对象

mOptDao2 := OptDao2{}
mOptDao2.name 

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

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

怎么办?

mOptDao2 := OptDao2{BaseDao:&BaseDao{}}
mOptDao2.name 

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

其他例:

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结构实例。

其他文章:
本文固定链接:https://www.hhtjim.com/struct-structure-type-2-embedded-structure-value-pointer-type-differences.html
matrix
本文章由 matrix 于2023年07月07日发布在Golang分类下,目前没有通告,你可以至底部留下评论。
转载请注明:struct结构体类型2 - 嵌入结构体值 指针类型区别-HHTjim'S 部落格
关键字:,

有3 条评论 »

  1. QQ游客 QQ游客 2023-9-17 23:39:55 +0800#2

    域名卖吗?加个QQ864716046好友,长期收域名,想卖随时可以找我

  2. harries harries 2023-8-24 14:31:57 +0800#1

    go大佬

    • matrix matrix 2023-8-30 14:07:09 +0800

      都是小白阶段。初学。。。

添加新评论 »

 🙈 😱 😂 😛 😭 😳 😀 😆 👿 😉 😯 😮 😕 😎 😐 😥 😡 😈 💡

插入图片

NOTICE: You should type some Chinese word (like “你好”) in your comment to pass the spam-check, thanks for your patience!