英文:
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;
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论