为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕标琳琳 2022-10-10 19:02:04
我是学习 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 惯用的事情是什么?是否只是将随机函数附加到结构并编写接口或其他东西?谢谢您的帮助...
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

为这两种类型声明一个具有通用功能的接口。使用接口类型作为参数类型。


// 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

}


查看完整回答
反对 回复 2022-10-10
?
心有法竹

TA贡献1866条经验 获得超5个赞

您可以通过从基本结构组合它们来为两个结构提供一些共享功能:


package main


import (

    "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


查看完整回答
反对 回复 2022-10-10
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

您可以使用interface{}参数和反射包来访问公共字段。很多人会说这种做法不地道。

func doSomething(t interface{}) error {
    d := reflect.ValueOf(t).FieldByName("d").String()
    fmt.Println(d)
    return nil}

在操场上尝试一个例子


查看完整回答
反对 回复 2022-10-10
  • 3 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号