gpt4 book ai didi

go - 在正常功能上返回 Golang 中的 'ok' 之类的映射

转载 作者:IT老高 更新时间:2023-10-28 13:04:15 25 4
gpt4 key购买 nike

在 Go 中,以下工作(注意 map 的一种使用有一个返回,另一种有两个返回)

package main

import "fmt"

var someMap = map[string]string { "some key": "hello" }

func main() {
if value, ok := someMap["some key"]; ok {
fmt.Println(value)
}

value := someMap["some key"]
fmt.Println(value)
}

但是,我不知道如何用我自己的函数做同样的事情。是否可以通过像 map 这样的可选返回来产生类似的行为?

例如:

package main

import "fmt"

func Hello() (string, bool) {
return "hello", true
}

func main() {
if value, ok := Hello(); ok {
fmt.Println(value)
}

value := Hello()
fmt.Println(value)
}

不会编译(由于错误 multiple-value Hello() in single-value context)...有没有办法让这个语法适用于函数 Hello() ?

最佳答案

map 是不同的,因为它是一个内置的 type 而不是一个函数。 Go Language Specification: Index Expressions 指定了访问 map 元素的 2 种形式。并由编译器支持。

使用函数是无法做到这一点的。如果一个函数有 2 个返回值,你必须“期待”这两个或一个都没有。

但是,您可以将任何返回值分配给 Blank identifier :

s, b := Hello()    // Storing both of the return values

s2, _ := Hello() // Storing only the first

_, b3 := Hello() // Storing only the second

您也可以选择不存储任何返回值:

Hello()            // Just executing it, but storing none of the return values

注意:您也可以将两个返回值都分配给空白标识符,尽管它没有任何用处(除了验证它正好有 2 个返回值):

_, _ = Hello()     // Storing none of the return values; note the = instead of :=

您也可以在 Go Playground 上尝试这些.

辅助功能

如果您多次使用它并且不想使用空白标识符,请创建一个丢弃第二个返回值的辅助函数:

func Hello2() string {
s, _ := Hello()
return s
}

现在你可以这样做了:

value := Hello2()
fmt.Println(value)

Go 1.18 泛型更新:Go 1.18 增加了泛型支持,现在可以编写一个通用的 First() 函数来丢弃第二个(或任何进一步的)返回值(value)观:

func First[T any](first T, _ ...any) T {
return first
}

这在 github.com/icza/gog 中可用,如 gog.First() (披露:我是作者)。

使用它:

value := First(Hello())
fmt.Println(value)

关于go - 在正常功能上返回 Golang 中的 'ok' 之类的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28487036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com