go - 根据类型断言等返回参数的数量更改行为

标签 go

我一直在学习 Go,对我来说特别有趣的一件事是类型断言的行为根据捕获的返回值数量而变化的方式:

var i interface{} = "hello"

val, ok := i.(int) // All good
fmt.Println(val, ok)

val = i.(int) // Panics
fmt.Println(val)

这感觉像是一种对用户定义函数非常有用的模式。用户要么必须明确获得“ok”的第二个返回值,要么使用下划线忽略它。在任何一种情况下,他们都明确表示他们知道该功能可能会失败。而如果他们只获得一个返回值,它可能会默默地失败。因此,如果用户没有检查错误(如果错误“永远不会”发生,这将是合理的), panic 或类似情况似乎是合理的。我假设这就是语言开发人员使类型断言以这种方式工作背后的逻辑。

但是当我试图找出如何做到这一点时,我一无所获。我知道类型断言不是实际功能。许多具有多个返回值的语言无法检查实际使用了多少返回值(MATLAB 是我所知道的唯一一种),但话又说回来,其中大多数不使用类型断言所展示的行为。

那么,这是否可能,如果可能,如何实现?如果不是,是否有特殊原因排除了这种行为,尽管内置类型断言是可能的?

最佳答案

遗憾的是,它们不能用于正常功能。据我所知,只有类型断言、映射值访问和范围允许它。

通常当你想要一个带有一个错误参数和可选的第二个错误参数的函数时,你将它们命名为

func DoSomething() (string, error) {...} // i will return an error
func MustDoSomething() string {...}  // i will panic

一个例子是https://golang.org/pkg/regexp/#MustCompile

关于go - 根据类型断言等返回参数的数量更改行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41815886/

相关文章:

RESTFUL API 中的 golang 结构或映射

Azure blob 首次写入

go - 当填充 channel 的函数调用未嵌入 Goroutine 中时,为什么会出现死锁?

user-interface - 使用 tivo/tview GoLang 库时获取实际的表单值

google-app-engine - goji 可以与 Google App Engine/Go 一起使用吗?

godep save ./... 似乎不适用于 https ://github. com/hashicorp/terraform

json - 在 config.json 文件中输入自定义类型值

go - 如何检测当前 Go 进程是否在 headless (headless)(非 GUI)环境中运行?

Golang Bufio 编写器不写入 TCP 连接

在代码中声明但未调用的函数时继续 panic