在类型声明中使用的结构体可用的访问方法。

huangapple go评论88阅读模式
英文:

Access method available to struct used in type declaration

问题

在Go语言中,无法直接访问类型的底层类型中声明的方法。在你的示例代码中,ResourceSet 类型是 Set 类型的别名,但是无法直接调用 Set 类型的 AddId 方法。

如果你想要在 ResourceSet 类型中调用 AddId 方法,一种解决方法是将 ResourceSet 定义为一个结构体,其中包含一个 Set 类型的字段,并在结构体中实现相应的方法。以下是修改后的示例代码:

package main

type Resource struct { 
  Id uint32
}

type Set map[uint32]struct{}

func (s Set) AddId(id uint32) {
  s[id] = struct{}{}
}

type ResourceSet struct {
  set Set
}

func (rs ResourceSet) Add(resource Resource) {
  id := resource.Id
  rs.set.AddId(id)
}

func main() {
  resource := Resource{Id: 1}

  rs := ResourceSet{
    set: make(Set),
  }
  rs.Add(resource)
}

这样,你就可以在 ResourceSet 类型中调用 AddId 方法了。

英文:

Is it possible to access methods that are declared in a type's underlying type? For example, I want a ResourceSet to be able to call my Set type's AddId method .

See: http://play.golang.org/p/Fcg6Ryzb67

package main

type Resource struct { 
  Id uint32
}

type Set map[uint32]struct{}

func (s Set) AddId(id uint32) {
  s[id] = struct{}{}
}

type ResourceSet Set

func (s ResourceSet) Add(resource Resource) {
  id := resource.Id
  s.AddId(id)
}

func main() {
  resource := Resource{Id: 1}

  s := ResourceSet{}
  s.Add(resource)
}

The error I'm getting is:

s.AddId undefined (type ResourceSet has no field or method AddId)

答案1

得分: 2

新命名类型的整个目的是拥有一个全新且空的方法集。

嵌入是另一回事,并且为调用嵌入类型的方法添加了一些语法糖。

英文:

The whole point of a new named type is to have a fresh and empty method set.

Embedding is a different story and add some syntactical sugar to call methods of embedded types.

答案2

得分: 0

这可以通过使用嵌入来解决:

type ResourceSet struct {
  Set
}

func (s ResourceSet) Add(resource Resource) {
  id := resource.Id
  s.AddId(id)
}

func main() {
  resource := Resource{Id: 1}

  s := ResourceSet{Set{}}
  s.Add(resource)
}

你还可以创建一个初始化构造函数来简化ResourceSet的创建过程:

func NewResourceSet() {
  return ResourceSet{Set{}}
}

func main() {
  s := NewResourceSet()
}
英文:

This can be solved using embedding:

type ResourceSet struct {
  Set
}

func (s ResourceSet) Add(resource Resource) {
  id := resource.Id
  s.AddId(id)
}

func main() {
  resource := Resource{Id: 1}

  s := ResourceSet{Set{}}
  s.Add(resource)
}

You can also create an initializing constructor to make the ResourceSet creation process simpler:

func NewResourceSet() {
  return ResourceSet{Set{}}
}

func main() {
  s := NewResourceSet()
}

huangapple
  • 本文由 发表于 2015年7月3日 03:05:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/31192663.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定