dongzhen4180 2014-12-20 05:12
浏览 31
已采纳

是否可以将先前声明的函数绑定到结构上?

Is it possible to bind a previously declared function to more than one struct? Ex:

package main

import "fmt"

// very useful function both A and B should have
func SayHi() {
    fmt.Println("hi!")
}

type A struct {} // A needs SayHi :(

type B struct {} // B needs SayHi :(

func main() {
     a := A{}
     a.SayHi()
     b := B{}
     b.SayHi()
}

The main reason is that I don't want to repeat SayHi implementation for each type that needs it, so this won't fulfill as an answer:

type A struct {}

func A SayHi() {
    fmt.Println("hi!")
}

type B struct {}

func B SayHi() {
    fmt.Println("hi!")
}

In other words, how to borrow|inherit|share|bind methods between structs?

PS: Not sure what terminology Go uses for that, but it seems interfaces doesn't apply to this case since it would require methods to be re implemented for each struct.

  • 写回答

1条回答 默认 最新

  • douyan1903 2014-12-20 05:19
    关注

    One way to do this is to declare the method as part of a third struct:

    type Foo struct {}
    
    func (f Foo) SayHi() {
        fmt.Prinln("hi!")
    }
    

    This method can then be added to A by embedding it:

    type A struct {
        Foo
    }
    

    A will expose all the methods of Foo, and since Foo is an empty struct it doesn't affect its in-memory layout. Note that when the SayHi method is called, it won't know whether it is being called on an A or Foo variable, so this is only really appropriate for self contained methods.

    If the method body does need to know the type of the receiver, you will need to explicitly declare the method on A. You could factor out the body into a helper function to share the implementation with other types.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。