Dictionary Go中的索引表达式是否根据上下文更改其返回类型?

Dictionary Go中的索引表达式是否根据上下文更改其返回类型?,dictionary,go,indexing,abstract-syntax-tree,Dictionary,Go,Indexing,Abstract Syntax Tree,如果映射包含键为x的条目,则a[x]是键为x的映射元素,a[x]的类型是M的元素类型 但是 赋值中使用的map[K]V类型映射上的索引表达式 或特殊窗体的初始化 v、 确定:=a[x] 产生额外的 非类型化布尔值 我还在学围棋。它是一种被烘焙到语言中的语法功能,并且仅在使用该语法时有效,即对v:=a[x]和v,ok:=a[x]的调用在AST中表示为不同类型的节点,如MapGetAndCheckExistsNodem,k,v,ok vs MapGetm,k,v?或者这是使用正常的Go语法实现的,并

如果映射包含键为x的条目,则a[x]是键为x的映射元素,a[x]的类型是M的元素类型

但是

赋值中使用的map[K]V类型映射上的索引表达式 或特殊窗体的初始化

v、 确定:=a[x]

产生额外的 非类型化布尔值


我还在学围棋。它是一种被烘焙到语言中的语法功能,并且仅在使用该语法时有效,即对v:=a[x]和v,ok:=a[x]的调用在AST中表示为不同类型的节点,如MapGetAndCheckExistsNodem,k,v,ok vs MapGetm,k,v?或者这是使用正常的Go语法实现的,并且索引函数不知何故知道它的输出稍后是否被解构?是否可以使用s:=a[x]语法强制索引表达式返回带有s.v和s.ok字段的元组或结构?

这是语言本身的一个任意规则。它用于避免打字时出现恐慌:

t, ok := x.(T)  
或者检查地图中是否确实存在密钥:

v, ok := m[k]
或检查接收工作:

x, ok := <-ch

只有在这些由语言设计者插入的特殊情况下,才可能使用自己的函数实现。有关更多信息,请参阅

这是一种特殊形式的赋值或初始化,仅由一些Go表达式支持,通常称为逗号ok习语。除了映射索引外,类型断言和通道接收也支持逗号ok。谢谢,@mkopriva!这是一个语言级的语法特性,对吗?也就是说,它的行为来源于编译器的工作方式,而不是索引功能的实现方式?也就是说,对于以不同方式对待a、b、c:=func和a:=func的情况X,不能实现自己的特殊语法?正确,您不能为自己的函数实现这种特殊形式。函数将始终返回其所有返回参数。您最多可以将一些返回值放入空白标识符>。例如,a,,:=func.没有规则,我不知道任何规则。在我的第一个评论中,我提到了另外两个可以使用逗号ok的情况。要确认我的声明,您可以转到并执行ctrl+f,确定。请参阅相关/可能重复:。