我可以传入“类型”作为函数参数吗?

时间:2014-05-20 19:58:48

标签: types interface parameters go func

我正在尝试构建一个库,它会自动将结构类型作为RESTful资源提供。

这是我在调用代码中看起来的样子:

package main

import (
    "fmt"
    "github.com/sergiotapia/paprika"
)

type Product struct {
    Name     string
    Quantity int
}

func main() {
    // You need to attach a resource by giving Paprika your route,
    // the struct type and optionally a custom resource manager.
    paprika.Attach("/products", Product, nil)
    paprika.Start(1337)
    log.Print("Paprika is up and running.")
}

在我的图书馆内,我试图创建附加功能:

package paprika

import (
    "fmt"
)

func Attach(route string, resource Type, manager ResourceManager) {

}

func Start(port int) {

}

type ResourceManager interface {
    add() error
    delete() error
    update(id int) error
    show(id int) error
    list() error
}

我如何接受任何" Type"结构?我的最终目标是使用反射来获取类型名称及其字段(这部分我已经知道该怎么做)。

有关如何处理此事的任何建议?

2 个答案:

答案 0 :(得分:1)

我找到的方法是:

func Attach(route string, resource interface{}) {
    fmt.Println(route)
    fmt.Println(reflect.TypeOf(resource))
}

然后我可以使用我想要的任何类型:

type Product struct {
    Name     string
    Quantity int
}

func main() {
    Attach("/products", new(Product))
}

结果:

/products
*main.Product

除非有更为惯用的方法,否则我认为我找到了解决方案。

答案 1 :(得分:0)

您可以使用interface{}作为函数的参数类型。然后,使用type switch来了解参数的 real 类型非常容易。

func MyFunc(param interface{}) {

    switch param.(type) {
        case Product:
            DoSomething()
        case int64:
            DoSomethingElse()
        case []uint:
            AnotherThing()
        default:
            fmt.Println("Unsuported type!")
    }
}