如何使函数接受多种类型?

Low*_*ong 9 go

警告:去新手.我有这样的功能:

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)
}
Run Code Online (Sandbox Code Playgroud)

我试图根据类型返回不同类型的字符串.我只是陷入了如何编写一个接受不同类型参数的函数的问题.任何帮助表示赞赏.

jus*_*ius 18

您可以使用接口类型作为参数,在这种情况下,您可以使用任何实现给定接口的类型调用该函数.在Go类型中,如果它们具有接口的方法,则自动实现任何接口.因此,如果要接受所有可能的类型,可以使用空接口(interface{}),因为所有类型都实现了这一点.不需要对您的功能进行其他修改.

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"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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"))
}
Run Code Online (Sandbox Code Playgroud)

会打印

INT


小智 9

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

func print_out_type[T any](x T) string {
    return fmt.Sprintf("%T", x)
}
Run Code Online (Sandbox Code Playgroud)

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