英文:
Get only a specific value out of a function call with multiple return values?
问题
给定一个返回多个值的函数swap
,假设它是某个我无法修改的API的一部分:
package main
import "fmt"
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("hello", "world")
fmt.Println(a, b)
}
是否可以使用swap
函数并仅获取第一个返回值,丢弃第二个返回值?我尝试了以下代码:
func main() {
a, b := swap("hello", "world")
fmt.Println(a)
}
错误信息:prog.go:10: b declared and not used [process exited with non-zero status]
而且以下代码也是不可能的:
a := swap("hello", "world")
错误信息:prog.go:10: multiple-value swap() in single-value context
当我不需要所有返回值时,如何处理返回多个值的函数?
代码基于"A tour of go - lesson 9"
英文:
Given swap
, a function that returns multiple values, and supposing it's part of some API I can't modify:
package main
import "fmt"
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("hello", "world")
fmt.Println(a, b)
}
Is it possible to use swap
function and get only the first returned value, discarding the second one? I tried this:
func main() {
a, b := swap("hello", "world")
fmt.Println(a)
}
ERROR: prog.go:10: b declared and not used [process exited with non-zero status]
And this is not possible too:
a := swap("hello", "world")
ERROR: prog.go:10: multiple-value swap() in single-value context
How to deal with functions that return multiple values when I don't need all the returned parts?
Code is based on "A tour of go - lesson 9"
答案1
得分: 12
使用空白标识符 _
:
a, _ := swap("hello", "world")
所有分配给空白标识符的内容都会被静默丢弃,不会引发警告。你还可以使用空白标识符来给结构体添加填充:
struct {
a byte
b byte
c byte
_ byte // 填充
}
空白标识符的另一个用途是在初始化全局变量时丢弃返回值:
var foo, _ = foo.NewFoo() // 忽略 NewFoo() 返回的错误
还有一种情况是当只需要范围中的一个值时:
for _, v := range mySlice { }
英文:
Use the blank identifier _
:
a, _ := swap("hello", "world")
Everything assigned to the blank identifier is silently discarded without a warning being raised. You can also use the blank identifier to add padding to structures:
struct {
a byte
b byte
c byte
_ byte // padding
}
Another usage of the blank identifier is to discard return values when initializing global variables:
var foo, _ = foo.NewFoo() // ignore error returned by NewFoo()
And when only one value of a range is required:
for _, v := range mySlice { }
答案2
得分: 0
如果我们不想使用任何额外的变量(例如分配给映射键),我们可以使用立即调用的函数表达式(IIFE)。
searchParams[v] = func(i int64, err error) int { return int(i) }(strconv.ParseInt("100", 10, 0))
英文:
In case we don't want to use any extra variable (e.g. assigning to a map key), then we can use Immediately Invoked function expression (IIFE).
searchParams[v] = func(i int64, err error) int { return int(i) }(strconv.ParseInt("100", 10, 0))
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论