【EBNF定义】Selector = "." identifier
【EBNF解释】就是说一个'.'加上一个标识符就是一个 Selector 。
【翻译】个人觉得不能翻译成选择器,应该翻译成一次选择,因为这是一个选择的过程,见后文。
【含义】 x.f 这个选择表达式中, f 就称之为 Selector ,就是一次选择,这次选择可能选择了类型为T的一个结构体中的一个 field ,也有可能选择了这个类型相关联的 method 。更重要的是,还有可能是选择了包含在类型 T 中的匿名 field中的field或者method。
【规则】对于x.f这个选择表达式:
1.假设 x 的类型为 T 或者 *T( T 的 underlying type 不能是指针类型或者 interface 类型),此时 x.f 表示 T 中最浅的 field f 或者 method f 。如果 T 中没有这样的 f ,那么这个选择表达式就是非法的。
2.假设 x 的类型为 I( I 的 underlying type 是 interface ),x.f 表示一个名叫 f 的 method ,具体的 method 由运行时 x 的 value 给出。如果 x 对应的 I 类型的 method set 中没有这个方法,那么这个选择表达式是非法的。
3.这有一个异常情况,如果 x 的类型是【 named pointer type :命名指针类型。注意,命名指针类型不能做为 method receiver ,也就是方法接收者】,同时,(\*x).f 是一个合法的选择表达式,那么 x.f 就是 (\*x).f 的缩写。
4.其他所有情况,x.f 这个表达式是非法的。
5.如果 x 是 pointer 类型【包括 named pointer type 和 unamed pointer type】,值是 nil ,x.f 会引起 runtime panic。
6.如果 x 是 interface 类型,值是 nil,x.f会引起 runtime panic。
有疑问加站长微信联系(非本文作者)