猿问

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

我对以下代码有两个问题

  1. emptyinterface.(int)可以返回一两个值,这个函数是怎么定义的来达到那个效果的呢?

  2. ok已使用短变量声明进行了两次声明,为什么在这种情况下可能?

package main


import (

    "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)

}


达令说
浏览 106回答 2
2回答

陪伴而非守候

这不是一个函数,它是一个语言特性。你不能编写一个函数来做到这一点,但编译器编写者可以创建一些语法来做到这一点。如果A左侧没有:=新变量,则 A无效。如果声明了至少一个新变量,则允许。

牛魔王的故事

在每种情况下,至少有一个与ok, 即i2and一起创建的新变量i3,因此重新声明 ofok非常好。这在短变量声明下的语言规范(重点是我的)中有很好的记录与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初是在同一块(或参数列表,如果该块是函数体)中以相同类型声明的,并且至少有一个非空白变量是新的。因此,重新声明只能出现在多变量短声明中。同样不清楚的是,您在这里指的是函数,类型断言是语言的一种功能,它断言接口中的值是否属于特定类型。如果断言成功,它总是返回基础值,否则返回失败。在其他地方有意义地使用它之前,您应该始终检查类型断言(第二个参数)的返回值。
随时随地看视频慕课网APP

相关分类

Go
我要回答