美文网首页
Go语言内嵌结构体成员名字冲突

Go语言内嵌结构体成员名字冲突

作者: 码二哥 | 来源:发表于2020-02-10 16:51 被阅读0次

参考:
http://c.biancheng.net/view/75.html

嵌入结构体内部可能拥有相同的成员名,成员重名时会发生什么?下面通过例子来讲解。

package main
import (
    "fmt"
)
type A struct {
    a int
}
type B struct {
    a int
}
type C struct {
    A
    B
}
func main() {
    c := &C{}
    c.A.a = 1
    fmt.Println(c)
}

代码说明如下:

  • 第 7 行和第 11 行分别定义了两个拥有 a int 字段的结构体。
  • 第 15 行的结构体嵌入了 A 和 B 的结构体。
  • 第 21 行实例化 C 结构体。
  • 第 22 行按常规的方法,访问嵌入结构体 A 中的 a 字段,并赋值 1。
  • 第 23 行可以正常输出实例化 C 结构体。

接着,将第 22 行修改为如下代码:

func main() {
    c := &C{}
    c.a = 1
    fmt.Println(c)
}

此时再编译运行,编译器报错:

.\main.go:22:3: ambiguous selector c.a

编译器告知 C 的选择器 a 引起歧义,也就是说,编译器无法决定将 1 赋给 C 中的 A 还是 B 里的字段 a。

在使用内嵌结构体时,Go语言的编译器会非常智能地提醒我们可能发生的歧义和错误。

相关文章

  • Go语言内嵌结构体成员名字冲突

    参考:http://c.biancheng.net/view/75.html 嵌入结构体内部可能拥有相同的成员名,...

  • Go Struct

    Go语言通过自定义结构的方式来实现新的类型,结构体是类型中带有成员的复合类型。 Go语言使用结构体和结构体成员来描...

  • 结构体

    结构体初识 结构体指针 结构体的匿名字段 结构体嵌套 Go语言中的OOP

  • 第04天(面对对象编程)_01

    01_匿名字段初始化.go 02_成员的操作.go 03_同名字段.go 04_非结构体匿名字段.go

  • Golang——结构体struct

    Go语言中没有“类”的改变,不支持类的“继承”等面向对象概念。Go语言中通过结构体的内嵌再配合接口比面向对象更具有...

  • 第六章 结构体

    Go语言中结构体是带有成员的复合类型。结构体成员是由一系列成员变量构成,这些成员变量也被称为“字段”。字段有以下特...

  • 11.结构体

    Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具...

  • Go语言基础之结构体

    Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具...

  • 第十四章:Go语言结构体struct

    1. 结构体 struct 1.1 概述 Go语言可以通过自定义的形式形成新的类型,结构体是类型中带有成员的复合类...

  • golang继承与接口

    继承 结构体 Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继 承...

网友评论

      本文标题:Go语言内嵌结构体成员名字冲突

      本文链接:https://www.haomeiwen.com/subject/hpaaxhtx.html