go语言:内嵌二义性(ambiguous selector )

内嵌两个结构体中有相同字段会发生二义性。
先看代码:

package main

import "fmt"

type Shape struct {
	id 	int
}

type Object struct {
	id int
}

type Color struct {
	//Object
	id int
}

type Rect struct {
	Shape
	*Color
}


func main()  {
	r := Rect{
		Shape: Shape{id:1},
		//Color: &Color{Object:Object{id:2}},
		Color: &Color{id:2},
	}

	fmt.Println(r.id)    //报错ambiguous selector r.id
	fmt.Println(r.Shape.id)  //正确用法
}

上面会报错:
./main.go:31:15: ambiguous selector r.id
r.id不知道引用哪个id。

但是,如果内嵌的id不在同一层级不会报错。而且总是引用前一个层级的id。稍微修改一下上面代码:

package main

import "fmt"

type Shape struct {
	id 	int
}

type Object struct {
	id int
}

type Color struct {
	Object
	//id int
}

type Rect struct {
	Shape
	*Color
}


func main()  {
	r := Rect{
		Shape: Shape{id:1},
		Color: &Color{Object:Object{id:2}},
		//Color: &Color{id:2},
	}

	fmt.Println(r.id)
}

这个正常,输出:1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值