首页 > 解决方案 > 如何在实现接口的结构中运行函数?

问题描述

大家好,我有这个代码

package main

import (
    "fmt"
    "math"
)

func main(){
    var structObj *Struct
    Obj1 := Obj1{}
    Obj2 := Obj2{}
    structObj = New(&Obj1)
    fmt.Println(structObj.name)
    structObj = New(&Obj2)
    fmt.Println(structObj.runFunc)
}

type IStruct interface {
    Id() string
    Name() string
    Run() string
}

type Obj2 struct {
}

func (self *Obj2) Id() string {
    return "Obj2Id"
}

func (self *Obj2) Name() string {
    return "Obj2"
}

func (self *Obj2) Run() string {
    return "Obj2 run func"
}

type Obj1 struct {
}

func (self *Obj1) Id() string {
    return "Obj1id"
}

func (self *Obj1) Name() string {
    return "Obj1"
}

func (self *Obj1) Run() string {
    return "Obj1 run func"
}

type Function func() string

type Struct struct {
    name        string
    runFunc    Function
    isCompleted bool
}

func New(impl IStruct) *Struct {
    return &Struct{
        name:        impl.Name(),
        runFunc:     impl.Run,
        isCompleted: false,
    }
}

输出

Obj1
0x6f6e00

当我调用实现 IStruct 的结构的名称时,它可以工作,但是当我从结构中调用 runFunc 时,它返回十六进制地址,当我调用 runFuncs 时我应该怎么做才能运行。

我这里最后想知道的是,当我想使用实现某个接口的结构作为接口时,我给出了结构的地址,为什么会出现这种情况?

标签: gointerface

解决方案


runFunc的是一个函数。打印一个函数只是打印它的地址。

如果要打印其输出,则需要实际执行它:

fmt.Println(structObj.runFunc())

另一方面,name是一个字符串,因此打印它的工作方式完全符合预期。

至于你的第二个问题,你需要调用New(&Obj1),因为实现接口的所有方法都使用指针接收器:(self *Obj1)

这意味着*Obj1实现了接口,但Obj1没有实现。如果您愿意,您可以将所有接收者更改为值接收者:(self Obj1)您将能够调用New(Obj1)


推荐阅读