根据参数类型如何获取返回值?

huangapple go评论80阅读模式
英文:

How I can get return value based on argument type?

问题

当我定义函数时,我必须设置参数和返回值的类型。我如何根据参数类型返回相应的值?例如:

func test(argument type) type {
    //如果参数类型为字符串,必须返回字符串
    //否则,如果参数类型为整数,必须返回整数
}

我可以这样做吗?如何实现?

英文:

When I define function

func test(a int, b int) int {
    //bla
}

I must set arguments and return value types. How I can return value based on argument type, ex

func test(argument type) type {
    //if argument type == string, must return string
    //or else if argument int, must return integer
}

Can I do this and how?

答案1

得分: 2

Go语言缺乏泛型(不打算就这个问题进行争论),你可以通过将interface{}传递给函数,然后在另一侧进行类型断言来实现泛型功能。

package main

import "fmt"

func test(t interface{}) interface{} {
    switch t.(type) {
    case string:
        return "test"
    case int:
        return 54
    }
    return ""
}

func main() {
    fmt.Printf("%#v\n", test(55))
    fmt.Printf("%#v", test("test"))
}

你将不得不对获取的值进行类型断言:

v := test(55).(int)
英文:

Go lacks generics, (not going to argue this point one way or the other), you can achieve this by passing interface{} to functions and then doing a type assertion on the other side.

package main

import "fmt"

func test(t interface{}) interface{} {
	switch t.(type) {
	case string:
		return "test"
	case int:
		return 54
	}
	return ""
}

func main() {
	fmt.Printf("%#v\n", test(55))
	fmt.Printf("%#v", test("test"))
}

You will have to type assert the value you get out

v := test(55).(int)

答案2

得分: 0

Go语言目前还没有像C#或Java那样的泛型功能。但它有一个空接口(interface{})。

以下是我认为能回答你问题的代码,如果我理解正确的话:

package main

import (
  "fmt"
  "reflect"
)


type generic interface{} // 你可以将类型名字改为X,不一定非得叫generic

func main() {
    n := test(10) // 我这里传递了一个int类型的参数
    fmt.Println(n)
}


func test(arg generic) generic {
   // 对arg进行一些操作
   result := arg.(int) * 2
   // 检查结果的数据类型是否与arg相同
   if reflect.TypeOf(arg) != reflect.TypeOf(result) {
     panic("类型不匹配")
   }
   return result;
}

希望对你有帮助!

英文:

Go does not yet have generics like C# or Java.
It does have an empty interface (interface{})

Here is code that I believe answers your question, if I understood it correctly:

package main

import (
  "fmt"
  "reflect"
)


type generic interface{} // you don't have to call the type generic, you can call it X

func main() {
	n := test(10) // I happen to pass an int
	fmt.Println(n)
}


func test(arg generic) generic {
   // do something with arg
   result := arg.(int) * 2
   // check that the result is the same data type as arg
   if reflect.TypeOf(arg) != reflect.TypeOf(result) {
     panic("type mismatch")
   }
   return result;
}

huangapple
  • 本文由 发表于 2014年9月20日 12:16:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/25945152.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定