gpt4 book ai didi

pointers - golang 指针上的指针作为函数参数

转载 作者:IT老高 更新时间:2023-10-28 13:02:54 26 4
gpt4 key购买 nike

我有以下功能:

func addCatsToMap(m map[string][]CatHouse, meowId int, treats Set, dog *Dog) {

//if (complicated thing) add Cat to m

}

其中Settreats的类型,是一个接口(interface),定义如下:

type Set interface {
Add(value string)
Contains(value string) (bool)
Length() (int)
RemoveDuplicates()
}

问题:

mtreatsdog是不是真的passed-by-referencemeowId它的值被复制了吗?

我假设:

  • m 是通过引用传递的,因为它是一张 map
  • dog 是一个结构。所以,我应该传递指针以避免复制数据

最佳答案

接口(interface)类型只是一组方法。请注意,接口(interface)定义的成员不指定接收器类型是否为指针。这是因为值类型的方法集是其关联指针类型的方法集的子集。那是一口。我的意思是,如果您有以下情况:

type Whatever struct {
Name string
}

你定义了以下两种方法:

func (w *Whatever) Foo() {
...
}

func (w Whatever) Bar() {
...
}

那么Whatever类型只有Bar()方法,而*Whatever类型有Foo()方法Bar()。这意味着如果您有以下界面:

type Grits interface {
Foo()
Bar()
}

然后 *Whatever 实现 GritsWhatever 没有,因为 Whatever 缺少方法 Foo ()。当您将函数的输入定义为接口(interface)类型时,您不知道它是指针还是值类型。

以下示例说明了一个以两种方式采用接口(interface)类型的函数:

package main

import "fmt"

type Fruit struct {
Name string
}

func (f Fruit) Rename(name string) {
f.Name = name
}

type Candy struct {
Name string
}

func (c *Candy) Rename(name string) {
c.Name = name
}

type Renamable interface {
Rename(string)
}

func Rename(v Renamable, name string) {
v.Rename(name)
// at this point, we don't know if v is a pointer type or not.
}

func main() {
c := Candy{Name: "Snickers"}
f := Fruit{Name: "Apple"}
fmt.Println(f)
fmt.Println(c)
Rename(f, "Zemo Fruit")
Rename(&c, "Zemo Bar")
fmt.Println(f)
fmt.Println(c)
}

你可以调用 Raname(&f, "Jorelli Fruit") 但不能调用 Rename(c, "Jorelli Bar"),因为两者都是 Fruit*Fruit 实现 Renamable,而 *Candy 实现 RenableCandy 实现不是。

http://play.golang.org/p/Fb-L8Bvuwj

关于pointers - golang 指针上的指针作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11130592/

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