[转]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输出出来
}
}
[转]Golang之struct类型的更多相关文章
- golang sync.noCopy 类型 —— 初探 copylocks 与 empty struct
问题引入 学习golang(v1.16)的 WaitGroup 代码时,看到了一处奇怪的用法,见下方类型定义: type WaitGroup struct { noCopy noCopy ... } ...
- sockaddr struct 类型重定义
windows.h和winsock2.h有类型重定义我是知道的,本来就一个库来说没问题,把winsock2放到windows.h前或先定义WIN32_LEAN_AND_MEAN都能解决问题但现的出了问 ...
- java matlab混合编程之返回值Struct类型
java matlab混合编程的时候当返回值是Struct类型(matlab中的返回类型)如何来取得(java中)其值? 上网找,看到这个网页:http://www.mathworks.cn/cn/h ...
- GoLang获取struct的tag
GoLang获取struct的tag内容:beego的ORM中也通过tag来定义参数的. 获取tag的内容是利用反射包来实现的.示例代码能清楚的看懂! package main import ( &q ...
- C++中struct类型增强
struct类型的加强: C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型. C++中的struct是一个新类型的定义声明. demo struct Student { ch ...
- 03C++语言对C的增强——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符
1.“实用性”增强 C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义. 2.C++对c语言register的增强 register关键字 ...
- error C2011: “timespec”:“struct”类型重定义
error C2011: “timespec”:“struct”类型重定义 C++ pthread pthread.h 中的 timespec 和time.h 中的 结构定义重复了 ,同时两个头文件中 ...
- c++——register关键字、struct类型、bool关键字、三目运算符
register关键字增强 //register关键字 请求编译器让变量a直接放在寄存器里面,速度快 //在c语言中 register修饰的变量 不能取地址,但是在c++里面做了内容 /* //1 r ...
- C++ c++与C语言的区别(struct类型的加强,函数-变量类型加强,bool类型)
//区别④:struct类型的加强(C++版本) #include<iostream> using namespace std; //C++中的struct是一个新类型的定义声明 //c+ ...
随机推荐
- java 中遇到的问题及解决方法
1.经常发现明明导入jar包,还是会报java.lang.NoSuchMethodError和java.lang.NoClassDefFoundError 试试网上的各种方法,包括重新导入jar包.重 ...
- 编程思考 PetShop读后感
标准,插拔式的设计思想建立一致的标准是通向“复用”的通道.分层,使其得到的充分的独立.一个东西如果独立了[不是孤立],这个事物就具有很强大的力量,这个和一个人的成长是相同的道理.所以呢,在写程序的过程 ...
- php圖片中寫入字符串然後生成圖片下載到本地
<?php /** * 生成卡片得類 * Enter description here ... * @author perry * @time 2014-03-03 10:02:20 */ cl ...
- JS引用类型之——数组
前言 数组作为JS中非常常用的引用类型,其功能是非常强大滴,今天小猪就彻底的看了下它.为了防止猪脑子不够用所以记录在案呐 1.数组的创建 var arrayObj = new Array(); //创 ...
- 第三方开源水面波浪波形view:WaveView
一个比较有趣的Android第三方开源波形view:WaveView,这种WaveView在一些常见的APP开发中,以水面波浪波形的形象的生动展示手机还剩余多少电量,存储容量还有多少等,比较形象直观生 ...
- 提升WordPress站点速度的八个建议
WordPress是一个很棒的开源程序,几乎我认识的站长朋友当中,粗略估算有80%使用Wordpress.但很棒不等于完美,就在我所认识的这些朋友中,几乎所有人都会抱怨Wordpress太臃肿,运行效 ...
- MongoDB常用操作一查询find方法db.collection_name.find()
来:http://blog.csdn.net/wangli61289/article/details/40623097 https://docs.mongodb.org/manual/referenc ...
- Tasklist and TaskKill
C:\Users\Administrator>tasklist /? TASKLIST [/S system [/U username [/P [password]]]] [/M ...
- Centos6升级内核2.6到3.x过程
最近公司有一个应用,安装需要内核版本3.1以后,不得已,需要升级下内核版本: 1. 安装必要依赖 # yum groupinstall "Development Tools" #y ...
- goldengate 12c 针对oracle 12c配置的主要变化
由于oracle 12c已经是多租户架构,在使用OGG同步的时候,需要考虑下面一些情况 一个 CDB包含多个PDB,源端部署的一个extract可访问所有pdb redo,理论上不需要每个pdb单独配 ...