登录
首页 >  Golang >  Go问答

Go 中的接口是否可以被包装?

来源:stackoverflow

时间:2024-02-21 16:39:28 485浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《Go 中的接口是否可以被包装?》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我想在 go 中执行类似以下操作,其中 c/c.go 包含:

package c

import (
    a "github.com/.../a"
    b "github.com/.../b"
)

func callhandler(pkgname string) (err error) {
    pkg, err := dereferencepackage(pkgname)
    ...

    method, err := getmethod(pkg, "handler")

    if err != nil {
        return err
    }

    return method()
}

...

{
    err = callhandler("a")
    ...
    err = callhandler("b")
    ...
}

a/a.go 包含:

package a

func handler() (err error) {
    // do whatever
    return err
}

b/b.go 包含:

package b

func handler() (err error) {
    // do whatever
    return err
}

一个明显的解决方案是切换:

func CallHandler(pkgName string) (err error) {
    switch pkgName {
    case "a":
        return a.Handler()
    case "b":
        return b.Handler()
    default:
        return fmt.Errorf("no handler defined for %s", pkgName)
    }
}

但我想知道是否可以更优雅地做到这一点,也许使用 reflect 包。提出同样问题的另一种方式是,包可以是 go 中的接口吗?


解决方案


一个简单的解决方案是创建一个注册表包,其中包含

  1. 一个映射(键为字符串,即包的名称,值是函数指针)
  2. 在地图中填充数据的函数。
  3. 根据传递的包名称从映射调用函数指针的函数。

在每个包中,实现 init() 函数,该函数将使用 Handler 函数注册包名称来注册包。

好了,本文到此结束,带大家了解了《Go 中的接口是否可以被包装?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>