猿问

传递多种参数类型的 Golang 习惯用法

我是学习 Go 的新手,并且有一个关于定义可能是两种类型之一的论点的问题。拿下代码:


type Thing struct {

  a int

  b int

  c string

  d string

}


type OtherThing struct {

  e int

  f int

  c string

  d string

}


func doSomething(t Thing/OtherThing) error {

  fmt.println(t.d)

  return nil

}

由于结构没有功能,我目前无法为它们编写接口。那么这里的 Go 惯用的事情是什么?是否只是将随机函数附加到结构并编写接口或其他东西?


谢谢您的帮助...


慕标琳琳
浏览 162回答 3
3回答

MYYA

为这两种类型声明一个具有通用功能的接口。使用接口类型作为参数类型。// Der gets d values.type Der interface {  D() string}type Thing struct {  a int  b int  c string  d string}func (t Thing) D() string { return t.d }type OtherThing struct {  e int  f int  c string  d string}func (t OtherThing) D() string { return t.d }func doSomething(t Der) error {  fmt.Println(t.D())  return nil}

心有法竹

您可以通过从基本结构组合它们来为两个结构提供一些共享功能:package mainimport (    "fmt")// Der gets d values.type Der interface {    D() string}type DBase struct {    d string}func (t DBase) D() string { return t.d }type Thing struct {    DBase    a int    b int    c string}type OtherThing struct {    DBase    e int    f int    c string}func doSomething(t Der) error {    fmt.Println(t.D())    return nil}func main() {    doSomething(Thing{DBase: DBase{"hello"}})    doSomething(OtherThing{DBase: DBase{"world"}})}DBase为 和提供字段 ( d) 并以Der相同的方式满足接口。它确实使结构文字的定义时间更长。ThingOtherThing

一只名叫tom的猫

您可以使用interface{}参数和反射包来访问公共字段。很多人会说这种做法不地道。func doSomething(t interface{}) error {     d := reflect.ValueOf(t).FieldByName("d").String()     fmt.Println(d)     return nil}在操场上尝试一个例子。
随时随地看视频慕课网APP

相关分类

Go
我要回答