英文:
In Go, how to write functions that take tuple arguments?
问题
我是你的中文翻译助手,以下是翻译好的内容:
我是Go语言的新手,正在将一个Python程序翻译成Go语言。
我非常喜欢三元运算符,所以我迅速实现了以下代码:
func t2(test bool, true_val, false_val string) string {
if test {
return true_val
} else {
return false_val
}
}
这段代码运行良好。
不幸的是,在Python中我有这样的代码:a = 'hi', 'hello' if xxx else 'bye', 'goodbye'
对于字符串元组,我的三元运算符应该如何编写?
我尝试过以下方法:
- 使用泛型,但了解到Go语言中不存在泛型。
- 尝试使用
func t2(test bool, true_val, false_val (string, string)) (string, string)
,但它无法编译通过。 - 使用类型定义:
type s2 string, string
和func t2(test bool, true_val, false_val s2) s2
,但它也无法编译通过。
谢谢。
英文:
I'm new to Go and I am translating a Python program to Go.
I'm a big fan of ternary operator so I quickly implemented
func t2(test bool, true_val, false_val string) string {
if test {
return true_val
} else {
return false_val
}
}
which works fine.
Unfortunately I had this in Python: a = 'hi', 'hello' if xxx else 'bye', 'goodbye'
How does my ternary operator would have to be written for tuples of strings?
I have tried:
- generics but learnt they don't exist in Go
- do
func t2(test bool, true_val, false_val (string, string)) (string, string)
but it doesn't compile - typedef:
type s2 string, string
andfunc t2(test bool, true_val, false_val s2) s2
but it doesn't compile
Thanks
答案1
得分: 2
实现具有两个string
返回值的函数可以如下所示:
func t(test bool, true1, true2, false1, false2 string) (string, string) {
if test {
return true1, true2
}
return false1, false2
}
测试代码如下:
a1, a2 := t(false, "hi", "hello", "bye", "goodbye")
fmt.Println(a1, a2)
a1, a2 = t(true, "hi", "hello", "bye", "goodbye")
fmt.Println(a1, a2)
输出结果如下:
bye goodbye
hi hello
使用切片[]string
作为返回值可能更易于阅读和处理。可以这样实现:
func t(test bool, trueVal []string, falseVal []string) []string {
if test {
return trueVal
}
return falseVal
}
测试代码如下:
trueVal := []string{"hi", "hello"}
falseVal := []string{"bye", "goodbye"}
a := t(false, trueVal, falseVal)
fmt.Println(a)
a = t(true, trueVal, falseVal)
fmt.Println(a)
输出结果如下:
[bye goodbye]
[hi hello]
你还可以选择创建一个包装的结构体struct
来保存任意数量的值(甚至具有任意/不同的类型):
type Pair struct {
v1, v2 string
}
func t(test bool, trueVal Pair, falseVal Pair) Pair {
if test {
return trueVal
}
return falseVal
}
测试代码如下:
trueVal := Pair{"hi", "hello"}
falseVal := Pair{"bye", "goodbye"}
a := t(false, trueVal, falseVal)
fmt.Println(a)
a = t(true, trueVal, falseVal)
fmt.Println(a)
输出结果如下:
{bye goodbye}
{hi hello}
你可以在Go Playground上尝试运行以上代码。
英文:
Implementing with 2 string
return values
It could look something like this:
func t(test bool, true1, true2, false1, false2 string) (string, string) {
if test {
return true1, true2
}
return false1, false2
}
Testing it:
a1, a2 := t(false, "hi", "hello", "bye", "goodbye")
fmt.Println(a1, a2)
a1, a2 = t(true, "hi", "hello", "bye", "goodbye")
fmt.Println(a1, a2)
Output (try it on the Go Playground):
bye goodbye
hi hello
Implementing with slice []string
return value
It might be easier to read and work with if we implement it with string
slices: []string
.
func t(test bool, trueVal []string, falseVal []string) []string {
if test {
return trueVal
}
return falseVal
}
Testing it:
trueVal := []string{"hi", "hello"}
falseVal := []string{"bye", "goodbye"}
a := t(false, trueVal, falseVal)
fmt.Println(a)
a = t(true, trueVal, falseVal)
fmt.Println(a)
Output (try it on the Go Playground):
[bye goodbye]
[hi hello]
Implementing with a wrapper struct
return value
You may also choose to create a wrapper struct
to hold an arbitrary number of values (even having arbitrary / different types):
type Pair struct {
v1, v2 string
}
func t(test bool, trueVal Pair, falseVal Pair) Pair {
if test {
return trueVal
}
return falseVal
}
Testing it:
trueVal := Pair{"hi", "hello"}
falseVal := Pair{"bye", "goodbye"}
a := t(false, trueVal, falseVal)
fmt.Println(a)
a = t(true, trueVal, falseVal)
fmt.Println(a)
Output (try it on the Go Playground):
{bye goodbye}
{hi hello}
答案2
得分: 0
你可以使用一个数组(或者如果数字是可变的,甚至可以使用切片):
func iff(test bool, true_val, false_val [2]string) (string, string) {
if test {
return true_val[0], true_val[1]
}
return false_val[0], false_val[1]
}
func main() {
a, b := iff(false, [2]string{"hi", "hello"}, [2]string{"bye", "goodbye"})
fmt.Println(a, b)
a, b = iff(true, [2]string{"hi", "hello"}, [2]string{"bye", "goodbye"})
fmt.Println(a, b)
}
测试结果:
bye goodbye
hi hello
英文:
You can use an array (or even a slice if it the number is variable):
func iff(test bool, true_val, false_val [2]string) (string, string) {
if test {
return true_val[0], true_val[1]
}
return false_val[0], false_val[1]
}
test:
func main() {
a, b := iff(false, [2]string{"hi", "hello"}, [2]string{"bye", "goodbye"})
fmt.Println(a, b)
a, b = iff(true, [2]string{"hi", "hello"}, [2]string{"bye", "goodbye"})
fmt.Println(a, b)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论