Go struct字段与接口方法同名

Dav*_*cua 1 go

来自第三方:

package lib

type Bar interface{
  Age() int
}

Foo(b Bar) int
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为Age它是方法名称和字段名称:

package main

import "lib"

type Person struct {
  Age int
}

func (p *Person)Age() int {
  return p.Age
}

func main() {
  p := Person()
  lib.Foo(p)
}
Run Code Online (Sandbox Code Playgroud)

没有重命名Person.Age,有没有办法调用lib.Foo()一个实例Person

Dar*_*tle 6

当然,不是直接的,原因已经说明了.但你可以创建一个围绕Person的包装器,并将其传递给:

type BarPerson struct {
    *Person
}

func (bp *BarPerson) Age() int {
    return bp.Person.Age
}

func main() {
    p := Person{37}
    lib.Foo(&BarPerson{&p})
}
Run Code Online (Sandbox Code Playgroud)