gpt4 book ai didi

go - 匿名字段作为指针或嵌入

转载 作者:IT王子 更新时间:2023-10-29 01:55:38 26 4
gpt4 key购买 nike

作为指针的匿名字段和通常的匿名字段有什么区别。考虑一下,我如何将 Foo 嵌入到 Bar 结构中。

看下面的代码片段:

首先以匿名字段为指针

package main

import (
"fmt"
)

type Foo struct{}

func (*Foo) Run() {
fmt.Println("Hello")
}

type Bar struct {
*Foo
}

func main() {
bar := new(Bar)
bar.Run()
}

和往常一样的第二个匿名字段:

package main

import (
"fmt"
)

type Foo struct{}

func (*Foo) Run() {
fmt.Println("Hello")
}

type Bar struct {
Foo
}

func main() {
bar := new(Bar)
bar.Run()
}

它们有什么区别?

更新:我从 revel webframework 中获取了这个样本,他们如何扩展自定义 Controller 。看看这个代码片段

type App struct {
*revel.Controller
}

为什么 Revel 使用指针来嵌入 Controller 结构。有什么意义?

最佳答案

鉴于Foo是一个空结构,将其嵌入 Bar 中不会更改 Bar 的内存占用.

但是,嵌入一个指向 Foo指针会变Bar ;它会添加一个指针值,初始化为nil .如果Foo的唯一目的|就是要有方法,那么用指针就多余了。

当然,你是否在 Foo 中添加了一些字段? ,然后,在指针的情况下,您还需要添加 bar.Foo = new(Foo)进入 main,否则你会遇到问题。

使用指针的好处是您可以共享相同的 Foo Bar 的多个实例之间的实例,否则你可以保留它 nil直到您真正需要它为止。

缺点是,如果始终存在 1 对 1 Foo,会稍微麻烦一些,效率也会稍低一些。 -到- Bar映射。

关于go - 匿名字段作为指针或嵌入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25683711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com