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. PHP分页类库

    <?php /** * @title: Ekcms page分页类库 * @version: 1.0 * @author: perry <perry@1kyou.com> * @pu ...

  2. 原生JS 添加或者删除某个class

    $S.addHandler($S.getId(fav[i]),'mouseover',function(){                this.className += " " ...

  3. Apache启用性能优化——启用Gzip,JS压缩

    #Add deflate module for enable GZIP function LoadModule deflate_module     modules/mod_deflate.so #A ...

  4. POJ 2240 && ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0

    http://poj.org/problem?id=2240 用log化乘法为加法找正圈 c++ 110ms,g++tle #include <string> #include <m ...

  5. ZOJ 2477 Magic Cube 暴力,模拟 难度:0

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1477 用IDA*可能更好,但是既然时间宽裕数据简单,而且记录状态很麻烦,就直接 ...

  6. POJ 1011 Sticks dfs,剪枝 难度:2

    http://poj.org/problem?id=1011 要把所给的集合分成几个集合,每个集合相加之和ans相等,且ans最小,因为这个和ans只在[1,64*50]内,所以可以用dfs一试 首先 ...

  7. 一看就懂的ReactJs入门教程(精华版)

    一看就懂的ReactJs入门教程(精华版) 现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和 ...

  8. IT公司100题-12-求1+2+…+n

    问题描述: 求1+2+…+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A?B:C).   分析: 利用类的静态变量实现: new一含有n ...

  9. 戴文的Linux内核专题:08内核配置(5)

    转自Linux中国 Linux内核拥有许多可以配置的特性,接下来我们还有许多要配置. 下一个可以配置的特性是x86的随机数生成器(x86 architectural random number gen ...

  10. SharePoint 2013 开发——开发并部署Provider-hosted APP

    博客地址:http://blog.csdn.net/FoxDave 本篇我们用Visual Studio创建并部署一个SharePoint Provider-hosted应用程序. 打开Visua ...