文章目录

  • 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 结构类型相关推荐

  1. golang 结构体简介

    Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型.试图表示一个现实世界中的实体. 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和 ...

  2. go结构体初始化_浅谈golang结构体偷懒初始化

    运行一段程序,警告: service/mysqlconfig.go:63::error: golang.guazi-corp.com/tools/ksql-runner/model.CreatingM ...

  3. golang值类型与引用类型的区别

    1.golang值类型与引用类型的区别 1.1 本质存储区别 值类型与引用类型的区别主要在于: 值类型的变量: 存储当前类型的存储的数据.值类型包括数值类型.bool.string.数组.struct ...

  4. C#中将结构类型数据存储到二进制文件中方法

    以往在vb6,vc6中都有现成的方法将结构类型数据写入和读取到二进制文件中,但是在c#中却没有现成的方法来实现,因此我查阅了一些资料,借鉴了网上一些同学的做法,自己写了个类似的例子来读写结构类型数据到 ...

  5. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

  6. Matlab中的结构类型struct

    结构(struct)数组 要在MALTAB中实现比较复杂的编程,就不能不用struct类型.而且在MATLAB中实现struct比C中更为方便. 4. 3.1 结构数组的创建 MATLAB提供了两种定 ...

  7. golang 获取struct类型_聊聊golang的类型断言

    序 本文主要研究一下golang的类型断言 类型断言 x.(T) 断言x不为nil且x为T类型 如果T不是接口类型,则该断言x为T类型 如果T类接口类型,则该断言x实现了T接口 实例1 func ma ...

  8. 不要伤害指针(3)--指针和结构类型的关系

    可以声明一个指向结构类型对象的指针. struct MyStruct {int a;int b;int c; }; struct MyStruct ss = {20,30,40};//声明了结构对象s ...

  9. DELPHI学习---结构类型

    Structured types (结构类型) 结构类型的一个实例可包含多个值.结构类型包括集合.数组.记录,也包括类.类引用(class-reference) 和接口类型.除了集合只能包含有序值以外 ...

最新文章

  1. SpringBoot 部署 Jar 文件,瘦身优化指南 !
  2. unity 公用的方法库
  3. cts测试之CertificateTest
  4. fake_useragent导入无法引用的解决方法
  5. c# 剔除sql语句‘尾巴‘的五种方法
  6. java jersey_Java Jersey使用总结(转)
  7. 一分钟搞懂app热更新
  8. 【2019 NWERC - E】Expeditious Cubing 【★】
  9. PTA L1-016 查验身份证(15分)
  10. selenium基本知识点+浏览器隐私模式
  11. 从零开始学前端 - 7. CSS盒模型 margin和padding详解
  12. 《多元统计分析》学习笔记之多元正态分布
  13. python读取heic/heif后缀的图像
  14. 戴森向小狗下刀,吸尘器市场中外乱战开启?
  15. MySql服务器忘记密码? 这几步轻松重置密码。
  16. python判断字符串是否为回文if语句_如何python判断字符串是否为回文?
  17. 回归方程的拟合优度检验_可用于判断回归方程的拟合优度.PPT
  18. 聚类 轮廓 matlab,通过聚类点matlab着色的等高线图
  19. 线程池原理及创建(转)
  20. ios使用stream抓包

热门文章

  1. JAVA并发之多线程基础(4)
  2. Go sync.Map 看一看
  3. 微信小程序框架——微信小程序前端开发工具
  4. R语言页游渠道分析(转)
  5. Windows Server 2003网络配置与管理 域控制器的管理
  6. Altlas M1 and Tips of Debugger Visualizers
  7. linux驱动基础开发1——linux 设备驱动基本概念-转
  8. 1064. 朋友数(20)-PAT乙级真题 Java
  9. iOS开发之touchesCancelled
  10. 1114. Family Property (25)-PAT甲级真题(并查集)