为了账号安全,请及时绑定邮箱和手机立即绑定

具有 1/2 值和短变量声明的函数两次分配给同一变量

具有 1/2 值和短变量声明的函数两次分配给同一变量

Go
达令说 2022-07-04 17:02:56
我对以下代码有两个问题emptyinterface.(int)可以返回一两个值,这个函数是怎么定义的来达到那个效果的呢?ok已使用短变量声明进行了两次声明,为什么在这种情况下可能?package mainimport (    "fmt")func main() {    var emptyinterface interface{}    emptyinterface=4    i1:=emptyinterface.(int)    fmt.Println(i1)    i2,ok:=emptyinterface.(int)//<- how the function is defined such that it can return either 1 (i1) or 2 values (i2,ok)?    fmt.Println(i2,ok)    i3,ok:=emptyinterface.(string) //<--why I can reassign to ok, which has assign previously?    fmt.Println(i3,ok)}
查看完整描述

2 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

  1. 这不是一个函数,它是一个语言特性。你不能编写一个函数来做到这一点,但编译器编写者可以创建一些语法来做到这一点。

  2. 如果A左侧没有:=新变量,则 A无效。如果声明了至少一个新变量,则允许。


查看完整回答
反对 回复 2022-07-04
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

在每种情况下,至少有一个与ok, 即i2and一起创建的新变量i3,因此重新声明 ofok非常好。

这在短变量声明下的语言规范(重点是我的)中有很好的记录

与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初是在同一块(或参数列表,如果该块是函数体)中以相同类型声明的,并且至少有一个非空白变量是新的。因此,重新声明只能出现在多变量短声明中。

同样不清楚的是,您在这里指的是函数,类型断言是语言的一种功能,它断言接口中的值是否属于特定类型。如果断言成功,它总是返回基础值,否则返回失败。在其他地方有意义地使用它之前,您应该始终检查类型断言(第二个参数)的返回值。


查看完整回答
反对 回复 2022-07-04
  • 2 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信