Golang 结构类型
文章目录
- 1.简介
- 2.匿名字段
- 3.已提升的字段与方法
- 4.字段标注
- 参考文献
1.简介
结构是已命名的元素序列,被称为字段,其中每一个元素都有一个名字和类型。 字段名可显示地指定(标识符列表)或隐式地指定(匿名字段)。 在结构中,非空白字段名必须是唯一的。
// 空结构
struct {}// 带7个字段的结构
type STest struct {x, y intu float32_ float32 // 填充空白字段_ float64 // 填充空白字段A *[]intF func()
}
2.匿名字段
通过有类型而无显式字段名声明的字段为匿名字段,亦称为嵌入式字段或类型的嵌入。 嵌入的类型必须是一个类型名 T 或一个非接口类型的指针 *T, 且 T 本身不能为指针类型。未指定字段名的类型名可以作为字段名。
// 带类型为T1,*T2,P.T3和*P.T4的4个匿名字段的结构
struct {T1 // 字段名为T1*T2 // 字段名为T2P.T3 // 字段名为T3*P.T4 // 字段名为T4x, y int // 字段名为x和y
}
以下为非法声明,因为字段名在结构类型中必须是唯一的:
struct {T // 与匿名字段*T及*P.T相冲突*T // 与匿名字段T及*P.T相冲突*P.T // 与匿名字段T及*T相冲突
}
3.已提升的字段与方法
在结构 x 中,假设 f 是匿名字段的字段或者方法,如果 x. f 是合法的,则匿名字段的字段或方法 f 即为已提升的。
已提升的字段除了不能用作复合字面量赋值时的字段名外, 其行为如同结构体的一般字段。比如下面通过复合字面量构造结构体时,匿名字段的字段不能直接使用。
type T struct {x, y int
}type Test struct{name stringT //匿名字段T
}//错误的使用,报编译错误:unknown field 'x' in struct literal of type Test
test:=Test{name:"dablelv",x:1,y:2}//错误的使用1,报编译错误:missing type in composite literal
test:=Test{"dablelv",{1,2}}//正确的使用
test:=Test{"dablelv",T{1,2}}
给定结构类型 S 与名为 T 的类型,若 S 包含一个匿名字段 T 或 *T,则包含在结构 S 方法集中的已提升方法有:接收者为 T 或 *T 的方法。参考如下示例:
package mainimport ("fmt"
)type T struct {x, y int
}
func (t T) print(){t.x=666fmt.Printf("in print()\n")
}
func (t *T) printByPointer(){t.x=888fmt.Printf("in printByPointer()\n")
}type Test struct{name stringT
}func main(){var test Testtest.print() //Test调用提升方法T.print()fmt.Printf("%#v\n",test)test.printByPointer() //Test调用提升方法(*T).printByPointer()fmt.Printf("%#v\n",test)(&test).print() //*Test调用提升方法T.print()fmt.Printf("%#v\n",test)(&test).printByPointer() //*Test调用提升方法(*T).printByPointer()fmt.Printf("%#v\n",test)
}
程序输出结果:
in print()
main.Test{name:"", T:main.T{x:0, y:0}}
in printByPointer()
main.Test{name:"", T:main.T{x:888, y:0}}
in print()
main.Test{name:"", T:main.T{x:888, y:0}}
in printByPointer()
main.Test{name:"", T:main.T{x:888, y:0}}
将匿名字段T变为*T,同样可以调用接收者为T 或 *T 的已提升方法。参考代码如下:
type Test struct{name string*T
}func main(){var test=Test{"",&T{0,0}}test.print() //Test调用提升方法T.print()fmt.Printf("%s %d %d\n",test.name,test.x,test.y)test.printByPointer() //Test调用提升方法(*T).printByPointer()fmt.Printf("%s %d %d\n",test.name,test.x,test.y)(&test).print() //*Test调用提升方法T.print()fmt.Printf("%s %d %d\n",test.name,test.x,test.y)(&test).printByPointer() //*Test调用提升方法(*T).printByPointer()fmt.Printf("%s %d %d\n",test.name,test.x,test.y)
}
运行结果:
in print()0 0
in printByPointer()888 0
in print()888 0
in printByPointer()888 0
4.字段标注
字段声明可后跟一个可选的字符串字面标注,成为字段的属性。 标注可通过反射接口获得,否则就会被忽略。
// 一个对应于时间戳协议缓存的结构.
// 标注字符串定义了协议缓存的字段号.
struct {microsec uint64 "field 1"serverIP6 uint64 "field 2"process string "field 3"
}
参考文献
[1] Go编程语言规范
Golang 结构类型相关推荐
- golang 结构体简介
Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型.试图表示一个现实世界中的实体. 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和 ...
- go结构体初始化_浅谈golang结构体偷懒初始化
运行一段程序,警告: service/mysqlconfig.go:63::error: golang.guazi-corp.com/tools/ksql-runner/model.CreatingM ...
- golang值类型与引用类型的区别
1.golang值类型与引用类型的区别 1.1 本质存储区别 值类型与引用类型的区别主要在于: 值类型的变量: 存储当前类型的存储的数据.值类型包括数值类型.bool.string.数组.struct ...
- C#中将结构类型数据存储到二进制文件中方法
以往在vb6,vc6中都有现成的方法将结构类型数据写入和读取到二进制文件中,但是在c#中却没有现成的方法来实现,因此我查阅了一些资料,借鉴了网上一些同学的做法,自己写了个类似的例子来读写结构类型数据到 ...
- golang枚举类型 - iota用法拾遗
在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...
- Matlab中的结构类型struct
结构(struct)数组 要在MALTAB中实现比较复杂的编程,就不能不用struct类型.而且在MATLAB中实现struct比C中更为方便. 4. 3.1 结构数组的创建 MATLAB提供了两种定 ...
- golang 获取struct类型_聊聊golang的类型断言
序 本文主要研究一下golang的类型断言 类型断言 x.(T) 断言x不为nil且x为T类型 如果T不是接口类型,则该断言x为T类型 如果T类接口类型,则该断言x实现了T接口 实例1 func ma ...
- 不要伤害指针(3)--指针和结构类型的关系
可以声明一个指向结构类型对象的指针. struct MyStruct {int a;int b;int c; }; struct MyStruct ss = {20,30,40};//声明了结构对象s ...
- DELPHI学习---结构类型
Structured types (结构类型) 结构类型的一个实例可包含多个值.结构类型包括集合.数组.记录,也包括类.类引用(class-reference) 和接口类型.除了集合只能包含有序值以外 ...
最新文章
- SpringBoot 部署 Jar 文件,瘦身优化指南 !
- unity 公用的方法库
- cts测试之CertificateTest
- fake_useragent导入无法引用的解决方法
- c# 剔除sql语句‘尾巴‘的五种方法
- java jersey_Java Jersey使用总结(转)
- 一分钟搞懂app热更新
- 【2019 NWERC - E】Expeditious Cubing 【★】
- PTA L1-016 查验身份证(15分)
- selenium基本知识点+浏览器隐私模式
- 从零开始学前端 - 7. CSS盒模型 margin和padding详解
- 《多元统计分析》学习笔记之多元正态分布
- python读取heic/heif后缀的图像
- 戴森向小狗下刀,吸尘器市场中外乱战开启?
- MySql服务器忘记密码? 这几步轻松重置密码。
- python判断字符串是否为回文if语句_如何python判断字符串是否为回文?
- 回归方程的拟合优度检验_可用于判断回归方程的拟合优度.PPT
- 聚类 轮廓 matlab,通过聚类点matlab着色的等高线图
- 线程池原理及创建(转)
- ios使用stream抓包
热门文章
- JAVA并发之多线程基础(4)
- Go sync.Map 看一看
- 微信小程序框架——微信小程序前端开发工具
- R语言页游渠道分析(转)
- Windows Server 2003网络配置与管理 域控制器的管理
- Altlas M1 and Tips of Debugger Visualizers
- linux驱动基础开发1——linux 设备驱动基本概念-转
- 1064. 朋友数(20)-PAT乙级真题 Java
- iOS开发之touchesCancelled
- 1114. Family Property (25)-PAT甲级真题(并查集)