zoukankan      html  css  js  c++  java
  • [转]Golang之struct类型

    http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=22312037&id=3756923

    一、struct
            Go语言中,也有struct,定义与C语言类似,举例说明如下:
            type person struct {
                name string
                age int
            }
            上面就声明了一个结构体person,包含两个字段。可以如下来使用这个struct:
            var P person        //P现在就是person类型的变量了
            P.name = "shicq"    //赋值给P的name属性
            P.age = 31            //赋值给P的age属性
            fmt.Printf("The person's name  is %s", P.name)    //访问P的name属性
            除了上面这种P的声明使用之外,还有两种声明使用方式:
            (1)按照顺序提供初始化值。
            P := person("Li Lei", 25)
            (2)通过field:value的方式初始化,这样可以任意顺序。
            P := person(age:24, name:"Han Meimei")      

    二、匿名字段
            前文介绍了如何定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go语言支持只提供类型,而不写字段名的方式,也就是匿名字段,或称为嵌入字段。当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。下面举例说明之:
            type Human struct {
                name string
                age int
            }
            type Student struct {
                Human        //匿名字段,那么默认Student就包含了Human的所有字段
                speciality string
            }
            //初始化Student
            mark := Student(Human{"shicq", 31}, "Computer Science")
            //访问相应字段
            fmt.Println("His name is ", mark.name)
            fmt.Println("His age is ", mark.age)
            fmt.Println("His speciality is ", mark.speciality)
            我们看到Student访问属性age和name的时候,就像访问自己所拥有的字段一样。当然Student也能通过访问Human来访问这两个字段:
            mark.Human = Human{"shicq", 31}
            mark.Human.age -= 1
            不仅仅是struct字段,所有内置类型和自定义类型都可以作为匿名字段,比如slice。
            如果human中有一个叫做phone的字段,而student也有一个叫做phone的字段,该当如何呢? 
            Go语言中最外层的优先访问,也就是当通过student.phone访问的时候,访问的是student里面的字段,而不是human里面的字段。
            这就允许我们可以重载通过匿名字段继承的一些字段,当然如果想访问重载后对应的匿名类型里的字段,可以通过匿名字段名来访问:
            type Human struct {
                name string
                age int
                phone string    //Human类型拥有的字段
            }
            type Employee struct {
                Human        //匿名字段Human
                speciality string
                phone string        //雇员的phone字段
            }
            Bob := Employee{Human{"Bob", 24, "777-444-xxxx"}, "Designer", "333-222"}
            fmt.Println("Bob's work phone is ", Bob.phone)                    
            fmt.Println("Bob's personal phone is ", Bob.Human.phone)        //访问Human的phone字段



    package main
    import (
    "fmt"
    "reflect" // 这里引入reflect模块
    )
    type User struct {
    Name string "user name" //这引号里面的就是tag
    Passwd string "user passsword"
    }
    func main() {
    user := &User{"chronos", "pass"}
    s := reflect.TypeOf(user).Elem() //通过反射获取type定义
    for i := 0; i < s.NumField(); i++ {
    fmt.Println(s.Field(i).Tag) //将tag输出出来
    }
    }

  • 相关阅读:
    html5标签---不常用新标签的整理
    拖拽demo--兼容--全局捕获
    Linux now!--网络配置
    windows下 memcached 和 redis 服务器安装
    MySQL5.6安装步骤(windows7/8_64位)
    zend 环境
    mysql自增id超大问题查询
    烦人的运营后台导出大批量数据
    kafka环境搭建和使用(python API)
    分布式系统中zookeeper实现配置管理+集群管理
  • 原文地址:https://www.cnblogs.com/freebird92/p/4197217.html
Copyright © 2011-2022 走看看