• 美好生活的价值追求和实现路径-社会关注-理论频道-中工网 2018-05-21
  • 保罗亲手为自己圆梦 火箭勇士双双会师西部决赛 2018-05-21
  • Floating production, storage and offloading vessel delivered in Qingdao 2018-05-20
  • 汽車定位跟蹤官員意圖敲詐 追蹤器該怎麼管 2018-05-20
  • 工作队精准发力助力贫困村“摘帽” 2018-05-20
  • 中消协发布榨汁机比较试验结果 2018-05-20
  • 游花海林芝,赏野生桃花 2018林芝桃花节29日开幕 2018-05-20
  • 19米99轻松卫冕 巩立姣:没突破20米有点可惜 2018-05-18
  • 海南省工商局出实招提高干部素质 强化工作作风 2018-05-18
  • 栾蕾英亮相TOP100时尚盛典 盛装亮相仙气十足 2018-05-18
  • 以合法形式掩盖非法目的的合同效力 2018-05-18
  • 4月解放领跑重卡行业 红岩保持增幅第一 2018-05-17
  • 不查“后来”,中国电影难有未来 2018-05-16
  • 欧盟公司与伊朗合作将遭美国制裁?德媒:欧美或渐行渐远 2018-05-16
  • 《青草的清香》:探索感官和情感的发展史 2018-05-16
  • GO学习笔记:struct的匿名字段

    栏目: GO语言 发布于: 2014-08-21 17:31:06

    GO学习笔记:struct的匿名字段

    我们上面介绍了如何定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。

    当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。

    让我们来看一个例子,让上面说的这些更具体化:

    package main
    import "fmt"
    
    type Human struct {
        name string
        age int
        weight int
    }
    
    type Student struct {
        Human  // 匿名字段,那么默认Student就包含了Human的所有字段
        speciality string
    }
    
    func main() {
        // 我们初始化一个学生
        mark := Student{Human{"Mark", 25, 120}, "Computer Science"}
    
        // 我们访问相应的字段
        fmt.Println("His name is ", mark.name)
        fmt.Println("His age is ", mark.age)
        fmt.Println("His weight is ", mark.weight)
        fmt.Println("His speciality is ", mark.speciality)
        // 修改对应的备注信息
        mark.speciality = "AI"
        fmt.Println("Mark changed his speciality")
        fmt.Println("His speciality is ", mark.speciality)
        // 修改他的年龄信息
        fmt.Println("Mark become old")
        mark.age = 46
        fmt.Println("His age is", mark.age)
        // 修改他的体重信息
        fmt.Println("Mark is not an athlet anymore")
        mark.weight += 60
        fmt.Println("His weight is", mark.weight)
    }
    图例如下:

    Student和Human的方法继承

    我们看到Student访问属性age和name的时候,就像访问自己所有用的字段一样,对,匿名字段就是这样,能够实现字段的继承。是不是很酷???还有比这个更酷的呢,那就是student还能访问Human这个字段作为字段名。请看下面的代码,是不是更酷了。

    mark.Human = Human{"Marcus", 55, 220}
    mark.Human.age -= 1
    通过匿名访问和修改字段相当的有用,但是不仅仅是struct字段哦,所有的内置类型和自定义类型都是可以作为匿名字段的。请看下面的例子:

    package main
    import "fmt"
    
    type Skills []string
    
    type Human struct {
        name string
        age int
        weight int
    }
    
    type Student struct {
        Human  // 匿名字段,struct
        Skills // 匿名字段,自定义的类型string slice
        int    // 内置类型作为匿名字段
        speciality string
    }
    
    func main() {
        // 初始化学生Jane
        jane := Student{Human:Human{"Jane", 35, 100}, speciality:"Biology"}
        // 现在我们来访问相应的字段
        fmt.Println("Her name is ", jane.name)
        fmt.Println("Her age is ", jane.age)
        fmt.Println("Her weight is ", jane.weight)
        fmt.Println("Her speciality is ", jane.speciality)
        // 我们来修改他的skill技能字段
        jane.Skills = []string{"anatomy"}
        fmt.Println("Her skills are ", jane.Skills)
        fmt.Println("She acquired two new ones ")
        jane.Skills = append(jane.Skills, "physics", "golang")
        fmt.Println("Her skills now are ", jane.Skills)
        // 修改匿名内置类型字段
        jane.int = 3
        fmt.Println("Her preferred number is", jane.int)
    }
    从上面例子我们看出来struct不仅仅能够将struct作为匿名字段、自定义类型、内置类型都可以作为匿名字段,而且可以在相应的字段上面进行函数操作(如例子中的append)。

    这里有一个问题:如果human里面有一个字段叫做phone,而student也有一个字段叫做phone,那么该怎么办呢?

    Go里面很简单的解决了这个问题,最外层的优先访问,也就是当你通过student.phone访问的时候,是访问student里面的字段,而不是human里面的字段。

    这样就允许我们去重载通过匿名字段继承的一些字段,当然如果我们想访问重载后对应匿名类型里面的字段,可以通过匿名字段名来访问。请看下面的例子:

    package main
    import "fmt"
    
    type Human struct {
        name string
        age int
        phone string  // Human类型拥有的字段
    }
    
    type Employee struct {
        Human  // 匿名字段Human
        speciality string
        phone string  // 雇员的phone字段
    }
    
    func main() {
        Bob := Employee{Human{"Bob", 34, "777-444-XXXX"}, "Designer", "333-222"}
        fmt.Println("Bob's work phone is:", Bob.phone)
        // 如果我们要访问Human的phone字段
        fmt.Println("Bob's personal phone is:", Bob.Human.phone)
    }

    本站文章除注明转载外,均为本站原创或编译?;队魏涡问降淖?,但请务必注明出处。
    转载请注明:文章转载自 七星彩票平台
    本文标题:GO学习笔记:struct的匿名字段
    IT技术书籍推荐:
    深入理解MySQL核心技术
    深入理解MySQL核心技术
    Sasba Pacbev (作者), 李芳 (译者), 于红芸 (译者), 邵健 (译者)
    《深入理解MySQL核心技术》:从公共可用性的意义上讲,MySQL源代码是开放源代码,但如果对其不了解,则实质上,它对于您来说是封闭的。MysQL开发团队的前成员Sasha Pachev通过《深入理解MySQL核心技术》给出了MySQL 5的全面指南,揭示了这一强大数据库的内部运作。您将直奔MySQL核心技术,了解各种数据结构和各种方便的功能的运作情况,了解如何添加新的存储引擎和配置选项等。 《深入理解MySQL核心技术》从结构概况讲起,在这一部分解释了MysQL的不同组件是如何协同工作的。接着将学习设置有效的可编译代码副本的步骤,然后使用基本架构添加自己的配置变量和存储引擎。