【问题标题】:How do you make a function accept multiple types?你如何让一个函数接受多种类型?
【发布时间】:2016-10-20 04:37:08
【问题描述】:

我有这样的功能:

package main
import "flag"
import "fmt"

func print_out_type(x anything) string {
    switch v := x.(type) {
        case string:
             return "A string"
        case int32:
             return "An Integer"
        default:
             return "A default"
    }
}

func main() {
    wordPtr := flag.String("argument1", "foo", "a String")
    numPtr := flag.Int("argument2", 42, "an Integer")
    flag.Parse()
    fmt.Println("word: ", *wordPtr)
    fmt.Println("number: ", *numPtr)
}

我正在尝试根据类型返回不同类型的字符串。我只是纠结于如何编写一个接受不同类型参数的函数。

【问题讨论】:

  • func print_out_type(x interface{}) string
  • 使用interface{} 作为类型。这是一个空接口;任何类型都实现它。请务必完成任何体面的 Go 教程,因为这是非常基本的事情。

标签: go


【解决方案1】:

您可以使用接口类型作为参数,在这种情况下,您可以使用实现给定接口的任何类型调用函数。在 Go 中,如果类型具有接口的方法,则它们会自动实现任何接口。所以如果你想接受所有可能的类型,你可以使用空接口(@98​​7654321@),因为所有类型都实现了它。无需对您的函数进行其他修改。

func print_out_type(x interface{}) string {
    switch v := x.(type) {
        case string:
             return "A string"
        case int32:
             return "An Integer"
        default:
             return "A default"
    }
}

您还可以使用反射包来研究接口变量的类型。例如:

func print_out_type(x interface{}) string {
    return reflect.TypeOf(x).String()
}

func main() {
    fmt.Println(print_out_type(42))
    fmt.Println(print_out_type("foo"))
}

将打印

int

字符串

【讨论】:

  • 如何获取发送给变量的值并在函数中使用?我正在使用 data := x.(ConcreteType) 但这将具有 switch 语句的范围,我不能在该范围之外使用它
【解决方案2】:

从 Go 1.18 开始。您可以使用泛型来指定可以在函数中使用的类型。

https://go.dev/doc/tutorial/generics

【讨论】:

    【解决方案3】:
    1. 首先,如果您使用的是类型断言,则需要检查此操作是否成功。 eg: value, ok := temp.(int)
    2. 其次,可以使用interface{}类型变量作为函数的参数。在Function中,可以使用类型断言来检查参数的真实类型并打印出来。

    【讨论】:

    • 您不需要带有类型开关的类型断言。
    • OP 没有使用类型断言,他也不应该使用。
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 2011-02-24
    • 2021-06-11
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2017-09-28
    相关资源
    最近更新 更多