gpt4 book ai didi

pointers - 通过引用传递自定义 slice 类型

转载 作者:IT王子 更新时间:2023-10-29 02:34:44 25 4
gpt4 key购买 nike

我无法理解指针、 slice 和接口(interface)在 Go 中的交互方式。这是我目前编写的代码:

type Loader interface {
Load(string, string)
}

type Foo struct {
a, b string
}

type FooList []Foo

func (l FooList) Load(a, b string) {
l = append(l, Foo{a, b})
// l contains 1 Foo here
}

func Load(list Loader) {
list.Load("1", "2")
// list is still nil here
}

鉴于此设置,然后我尝试执行以下操作:

var list FooList
Load(list)
fmt.Println(list)

但是,列表在这里总是nil。我的 FooList.Load 函数确实向 l slice 添加了一个元素,但仅此而已。 Load 中的 list 仍然是 nil。我想我应该能够将引用传递到我的 slice 周围并将东西附加到它。不过,我显然遗漏了一些关于如何让它发挥作用的东西。

最佳答案

(代码在http://play.golang.org/p/uuRKjtxs9D)

如果您打算对您的方法进行更改,您可能希望使用指针接收器。

// We also define a method Load on a FooList pointer receiver.
func (l *FooList) Load(a, b string) {
*l = append(*l, Foo{a, b})
}

但是,这会导致 FooList 值本身不能满足 Loader 接口(interface)。

var list FooList
Load(list) // You should see a compiler error at this point.

不过,指向 FooList 值的指针将满足 Loader 接口(interface)。

var list FooList
Load(&list)

完整代码如下:

package main

import "fmt"

/////////////////////////////
type Loader interface {
Load(string, string)
}

func Load(list Loader) {
list.Load("1", "2")
}
/////////////////////////////


type Foo struct {
a, b string
}

// We define a FooList to be a slice of Foo.
type FooList []Foo

// We also define a method Load on a FooList pointer receiver.
func (l *FooList) Load(a, b string) {
*l = append(*l, Foo{a, b})
}

// Given that we've defined the method with a pointer receiver, then a plain
// old FooList won't satisfy the Loader interface... but a FooList pointer will.

func main() {
var list FooList
Load(&list)
fmt.Println(list)
}

关于pointers - 通过引用传递自定义 slice 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18731376/

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