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输出出来
}
}

[转]Golang之struct类型的更多相关文章

  1. golang sync.noCopy 类型 —— 初探 copylocks 与 empty struct

    问题引入 学习golang(v1.16)的 WaitGroup 代码时,看到了一处奇怪的用法,见下方类型定义: type WaitGroup struct { noCopy noCopy ... } ...

  2. sockaddr struct 类型重定义

    windows.h和winsock2.h有类型重定义我是知道的,本来就一个库来说没问题,把winsock2放到windows.h前或先定义WIN32_LEAN_AND_MEAN都能解决问题但现的出了问 ...

  3. java matlab混合编程之返回值Struct类型

    java matlab混合编程的时候当返回值是Struct类型(matlab中的返回类型)如何来取得(java中)其值? 上网找,看到这个网页:http://www.mathworks.cn/cn/h ...

  4. GoLang获取struct的tag

    GoLang获取struct的tag内容:beego的ORM中也通过tag来定义参数的. 获取tag的内容是利用反射包来实现的.示例代码能清楚的看懂! package main import ( &q ...

  5. C++中struct类型增强

    struct类型的加强: C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型. C++中的struct是一个新类型的定义声明. demo struct Student { ch ...

  6. 03C++语言对C的增强——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符

    1.“实用性”增强 C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义. 2.C++对c语言register的增强 register关键字 ...

  7. error C2011: “timespec”:“struct”类型重定义

    error C2011: “timespec”:“struct”类型重定义 C++ pthread pthread.h 中的 timespec 和time.h 中的 结构定义重复了 ,同时两个头文件中 ...

  8. c++——register关键字、struct类型、bool关键字、三目运算符

    register关键字增强 //register关键字 请求编译器让变量a直接放在寄存器里面,速度快 //在c语言中 register修饰的变量 不能取地址,但是在c++里面做了内容 /* //1 r ...

  9. C++ c++与C语言的区别(struct类型的加强,函数-变量类型加强,bool类型)

    //区别④:struct类型的加强(C++版本) #include<iostream> using namespace std; //C++中的struct是一个新类型的定义声明 //c+ ...

随机推荐

  1. Objective-C:Foundation框架-概述

    iOS的整体架构(以iOS8为例)图如下: 从Cocoa Touch到Core OS下面四层包含了开发iOS应用程序所用到的所有API(第三方框架也是基于这几个层的).每个层又都包含了许多框架.框架就 ...

  2. influxdb和boltDB简介——底层本质类似LMDB,MVCC+B+树

    influxdb influxdb是最新的一个时间序列数据库,最新一两年才产生,但已经拥有极高的人气.influxdb 是用Go写的,0.9版本的influxdb对于之前会有很大的改变,后端存储有Le ...

  3. WPF布局的6种面板

    WPF用于布局的面板主要有6个,StackPanel(栈面板).WrapPanel(环绕面板).DockPanel(停靠面板).Canvas(画布).Grid(网格面板)和 UniformGrid(均 ...

  4. async 和await

    这个是.NET 4.5的特性,所以要求最低.NET版本为4.5. 看很多朋友还是使用的Thread来使用异步多线程操作,基本上看不见有使用Async.Await进行异步编程的.各有所爱吧,其实都可以. ...

  5. c#获取系统时间的方法(转)

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

  6. iOS各种动画效果

    ios各种动画效果 最普通动画: //开始动画 [UIView beginAnimations:nil context:nil];  //设定动画持续时间 [UIView setAnimationDu ...

  7. POJ 2482 扫描线(面积覆盖最大次数)

    Stars in Your Window Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10806   Accepted:  ...

  8. jmeter内存溢出

    当我用jmeter来测试elasticsearch性能的时候,发生过三种性质的内存溢出. 1. index 由于数据流过大,内存使用超过jmeter默认的上限,就溢出了. 用记事本打开jmeter.b ...

  9. 一模 (4) day2

    第一题: 题目大意:二进制数 n mod m 的结果是多少?  n 的长度(二进制数的位数)<=200 000:  m 的长度(二进制数的位数)<=20. 解题过程: 1.我的算法是直接高 ...

  10. iOS App创建桌面快捷方式

    http://www.cocoachina.com/ios/20150827/13243.html 先mark,暂时用不到