当前位置: 首页 > 面试题库 >

带有指针接收器的Golang方法

轩辕阳焱
2023-03-14
问题内容

我有这个示例代码

package main

import (
    "fmt"
)

type IFace interface {
    SetSomeField(newValue string)
    GetSomeField() string
}

type Implementation struct {
    someField string
}

func (i Implementation) GetSomeField() string {
    return i.someField
}

func (i Implementation) SetSomeField(newValue string) {
    i.someField = newValue
}

func Create() IFace {
    obj := Implementation{someField: "Hello"}
    return obj // <= Offending line
}

func main() {
    a := Create()
    a.SetSomeField("World")
    fmt.Println(a.GetSomeField())
}

SetSomeField 无法正常工作,因为其接收器不是指针类型。

如果我将方法更改为指针接收器,那么我希望它可以正常工作,如下所示:

func (i *Implementation) SetSomeField(newValue string) { ...

编译会导致以下错误:

prog.go:26: cannot use obj (type Implementation) as type IFace in return argument:
Implementation does not implement IFace (GetSomeField method has pointer receiver)

如何在不创建副本的情况下struct使接口 方法实现SetSomeField实际实例的值?

这是一个可入侵的代码段:https :
//play.golang.org/p/ghW0mk0IuU


问题答案:

您指向结构的指针应实现该接口。这样,您可以修改其字段。

查看我如何修改您的代码,以使其按预期工作:

package main

import (
    "fmt"
)

type IFace interface {
    SetSomeField(newValue string)
    GetSomeField() string
}

type Implementation struct {
    someField string
}

func (i *Implementation) GetSomeField() string {
    return i.someField
}

func (i *Implementation) SetSomeField(newValue string) {
    i.someField = newValue
}

func Create() *Implementation {
    return &Implementation{someField: "Hello"}
}

func main() {
    var a IFace
    a = Create()
    a.SetSomeField("World")
    fmt.Println(a.GetSomeField())
}


 类似资料:
  • 问题内容: 在Golang中工作,正在尝试使用接口将使用相似方法的一组结构归为一组。简而言之,我有这个: 然后,应该用作接口的结构: 我想念什么?还是我做错了什么? 问题答案: 如果您的接口这样声明: 然后,任何实现a的类型都将满足该接口。 在您的情况下,然后创建此方法: 这意味着类型满足接口。 但是..注意那里。没有实现该接口,而是由谁来实现。 因此,在尝试为接口变量分配类型时,请确保使用指针而

  • 问题内容: 对于我来说,目前尚不清楚,在这种情况下,我想使用值接收器而不是始终使用指针接收器。 回顾一下文档: 该 文档 还说:“对于基本类型,切片和小型结构之类的类型,值接收器非常便宜,因此,除非该方法的语义要求使用指针,否则值接收器是高效且清晰的。” 首先, 它说“非常便宜”,但问题是它比指针接收器便宜。因此,我做了一个小的基准测试(基于要点的代码),向我展示了,即使对于只有一个字符串字段的结

  • 问题内容: 我很难理解为什么这些规则与指针类型.vs的方法集相关联。值类型 有人可以解释一下原因吗(从界面表的角度) (威廉·肯尼迪博客的摘录) 规格摘要 方法集 类型可能具有与之关联的方法集。接口类型的方法集是其接口。任何其他类型T的方法集都包含以接收者类型T声明的所有方法。相应指针类型 T的方法集是所有以接收者 T或T声明的方法的集合(也就是说,它还包含方法T集)。进一步的规则适用于包含匿名字

  • 问题内容: 我一直在从关于指针接收器的话题中出错,我决定用谷歌搜索术语的含义,并且阅读了有关指针接收器的不同资源和文档。例如:http : //golang.org/doc/faq和http://jordanorelli.com/post/32665860244/how- to-use-interfaces-in-go。 虽然,尽管他们谈论这些术语,但仍未能准确定义它们。不过,从上下文来看,我认为

  • 问题内容: 我只是在环游世界中练习51练习。解释声称,该方法在接收到a 而不是指向a的指针时无效。 然而,当我改变声明,以在输出唯一的变化是丢失的标记指针。 那么,即使变量不是指针,为什么还要更改它收到的变量呢? 问题答案: 它不会“接收”值。Go是强类型的,因此如果在某处指定了指向T的指针,则指向T()的指针是唯一可以作为该类型位置的值出现的选项。 “魔术”在编译器中,可以在某些条件下有效地“重

  • 问题内容: 已关闭 。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗? 添加详细信息并通过编辑此帖子来澄清问题。 3个月前关闭。 改善这个问题 关于“ X不能实现Y(…方法具有指针接收器) ”的事情已经有一些问答,但是对我来说,他们似乎在谈论不同的事情,而不适用于我的具体情况。 因此,我没有使问题变得非常具体,而是使之变得笼统和抽象-似乎有几种不同的情况可以使此错误发生,请有人总结一