• 合众人寿阜阳中支因部分保单客户信息不真实被罚款10万元 2018-07-17
  • 顾客网购电视安装时发现屏裂 因已开箱无法正常退货 2018-07-17
  • 20多年未开口的央视女主播 在政协会上说了什么? 2018-07-17
  • 为什么只有韩国能生产大尺寸OLED?中国不行 2018-07-16
  • “高盐值”真面目 这些食品不咸也高盐 2018-07-16
  • 山西太原:出租车拟调价以应对网约车市场冲击 2018-07-15
  • 默勒镇多措并举全面打响生态环境保护攻坚战 2018-07-15
  • 去年广州专利申请量首破10万件 2018-07-15
  • 冬日浪漫礼遇 圣诞节游戏里“约“起来 2018-07-15
  • 中国空军歼-10C战机担负战斗值班任务 2018-07-15
  • 三国是我对生命话题的探讨 2018-07-15
  • 台媒:大陆宠物旅馆春节一床难求 豪华单间一天800元 2018-07-14
  • 大学生:这个寒假不一样(教育眼) 2018-07-14
  • 女性消费释放诱人商机 市场规模接近2.5万亿元 2018-07-14
  • “会升值”的收藏品盯上老年人钱包 往往没见到实物 2018-07-13
  • 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的不同组件是如何协同工作的。接着将学习设置有效的可编译代码副本的步骤,然后使用基本架构添加自己的配置变量和存储引擎。