结构struct

  1. Go 中的struct与C中的struct非常相似,并且Go没有class

  2. 使用 type <Name> struct{} 定义结构,名称遵循可见性规则(即首字母大写对外可见)。 type person struct{}

  3. 支持指向自身的指针类型成员,支持匿名结构,可用作成员或定义成员变量

  4. 匿名结构也可以用于struct的值,可以使用字面值对结构进行初始化

  5. 允许直接通过指针来读写结构成员

  6. 相同类型的成员可进行直接拷贝赋值

  7. 支持 == 与 != 比较运算符,但不支持 > 或 <

  8. 支持匿名字段,本质上是定义了以某个类型名为名称的字段

  9. 嵌入结构作为匿名字段看起来像继承,但不是继承

  10. 可以使用匿名字段指针

一、结构体的基本使用案例

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. /**
  6. 定义一个结构体,类似于其他语言的class
  7. */
  8. type person struct {
  9. Name string
  10. Age int
  11. }
  12.  
  13. func main() {
  14. // struct 对属性操作使用符号 . ;这里赋值采用两种方式,既可以使用默认值,也可以在外部赋值
  15. a := person{
  16. Name : "liang",
  17. Age : 29,
  18. }
  19. //a.Age = 29
  20. fmt.Println("a修改前:", a)
  21. //第一次修改并打印
  22. modifyPerson(a)
  23. fmt.Println("a第一次修改后:", a)
  24. //第二次修改并打印
  25. modifyPersonPointer(&a)
  26. fmt.Println("a第二次修改后:", a)
  27.  
  28. /**
  29. 假如有一种场景有很多需要修改person内容,那么每次传入都需要取地址符号,这样很麻烦,可以在赋值对时候直接取得对应对地址
  30. 这种方式是开发对推荐方式
  31. */
  32. b := &person{
  33. Name : "xuli",
  34. Age : 27,
  35. }
  36. fmt.Println("b修改前:", b)
  37. modifyPersonPointer(b)
  38. fmt.Println("b修改后:", b)
  39. }
  40.  
  41. /**
  42. 从打印结果可以看出这里传入对是值类型,修改person内容并不会修改person原始值
  43. */
  44. func modifyPerson(per person) {
  45. per.Age = 18
  46. fmt.Println("修改时:", per)
  47. }
  48.  
  49. func modifyPersonPointer(per *person) {
  50. per.Age = 19
  51. fmt.Println("修改时:", per)
  52. }

运行结果:

1
2
3
4
5
6
7
8
a修改前: {liang 29}
修改时: {liang 18}
a第一次修改后: {liang 29}
修改时: &{liang 19}
a第二次修改后: {liang 19}
b修改前: &{xuli 27}
修改时: &{xuli 19}
b修改后: &{xuli 19}

二、匿名结构体以及结构体内嵌案例

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. /**
  8. 结构体嵌套,使用对就是匿名结构体
  9. */
  10. type person struct {
  11. UserName string
  12. UserAge int
  13. Constact struct{
  14. Phone, City string
  15. }
  16. }
  17.  
  18. func main() {
  19. /**
  20. 匿名结构体对应用案例
  21. */
  22. st := &struct {
  23. Name string
  24. Age int
  25. }{
  26. Name : "liang",
  27. Age : 29,
  28. }
  29. fmt.Println(st)
  30.  
  31. /**
  32. 机构体嵌套打印
  33. */
  34. per := person{UserName: "liangyongxing", UserAge: 29}
  35. per.Constact.Phone = "15701183662"
  36. per.Constact.City = "北京"
  37. fmt.Println(per)
  38. }

运行结果:

1
2
&{liang 29}
{liangyongxing 29 {15701183662 北京}}

三、结构体的内嵌组合模拟继承案例

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. /**
  8. 这里说对是结构体对组合,它对功能类似于其他语言对继承
  9. */
  10. type Human struct {
  11. sex int
  12. }
  13.  
  14. type teacher struct {
  15. Human
  16. Name string
  17. Age int
  18. }
  19.  
  20. type Student struct {
  21. Human
  22. Name string
  23. Age int
  24. }
  25.  
  26. func main() {
  27. /**
  28. 在初始化对时候Go将嵌入对结构名称当成属性一样对待,将对应Human作为属性,这样可以在初始化对时候直接赋值
  29. 第二种赋值方式可以通过符号 . 来操作赋值
  30. */
  31. tea := teacher{Name: "teacher", Age: 36, Human: Human{sex: 1}}
  32. // tea.Human.sex = 1 或者 tea.sex = 1
  33. stu := Student{Name: "student", Age: 15, Human: Human{sex: 2}}
  34. //stu.Human.sex = 2 或者 tea.sex = 2
  35. /**
  36. 1. 既然结构嵌入进来来,就和其他语言继承一样,可以直接使用父类对属性,即 tea.sex = 1 也是可以对
  37. 2. 那 1 方式简单为什么还要保留 tea.Human.sex = 1 这种方式呢?是因为为来防止外部引用有同名对属性,为了区分
  38. */
  39. fmt.Println(tea)
  40. fmt.Println(stu)
  41. }

运行结果:

1
2
{{1} teacher 36}
{{2} student 15}

GO语言基础之struct的更多相关文章

  1. GO_06:GO语言基础之struct

    结构struct 1. Go 中的struct与C中的struct非常相似,并且Go没有class 2. 使用 type <Name> struct{} 定义结构,名称遵循可见性规则(即首 ...

  2. C#语言基础

    第一部分 了解C# C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.NET的应用而开发的.体现了当今最新的程序设计技术的功能和精华..NET框架为C#提供了 ...

  3. C语言基础回顾

    第一章 C语言基础 1.  C语言编译过程 预处理:宏替换.条件编译.头文件包含.特殊符号 编译.优化:翻译并优化成等价的中间代码表示或汇编代码 汇编:生成目标文件,及与源程序等效的目标的机器语言代码 ...

  4. 【GoLang】GO语言系列--002.GO语言基础

    002.GO语言基础 1 参考资料 1.1 http://www.cnblogs.com/vimsk/archive/2012/11/03/2736179.html 1.2 https://githu ...

  5. 语言基础:C#输入输出与数据类型及其转换

    今天学习了C#的定义及特点,Visual Studio.Net的集成开发环境和C#语言基础. C#语言基础资料——输入输出与数据类型及其转换 函数的四要素:名称,输入,输出,加工 输出 Console ...

  6. 01_C语言基础

    内容提要: 1. C语言概述2. 数据类型.运算符与表达式3. C语言程序结构 4. VC6.0使用练习 知识详解01:C语言的历史 1. C语言与其它语言比较 汇编语言: (1).可直接对硬件进行操 ...

  7. C语言基础复习总结

    C语言基础复习总结 大一学的C++,不过后来一直没用,大多还给老师了,最近看传智李明杰老师的ios课程的C语言入门部分,用了一周,每晚上看大概两小时左右,效果真是顶一学期的课,也许是因为有开发经验吧, ...

  8. Go语言基础(二)

    Go语言基础(二) 跟着上篇,继续看Go基础 一.变量作用域 与C类似,有全局变量.局部变量.形参之分 package main import "fmt" // 全局变量 var ...

  9. Go语言基础之反射

    Go语言基础之反射 本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ...

随机推荐

  1. Java内存是怎么管理的

    JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 ( ...

  2. 手机html根据手机分辨率网页文字大小自适应

    问题:不同手机型号屏幕尺寸大不相同,导致同样的文字,有的显示一行,有的显示多行. 通过查资料和自己的尝试解决:网页开发习惯的px单位,手机html开发不适用. 源代码如下: <!DOCTYPE ...

  3. curl_get和curl_post,伪造请求头,绕过防盗链下载文件

    //curl-get function curl_get($url, $timeout = 10) { $ch = curl_init();//初始化 curl_setopt($ch, CURLOPT ...

  4. POI2018

    [BZOJ5099][POI2018]Pionek(极角排序+two pointers) 几个不会严谨证明的结论: 1.将所有向量按极角排序,则答案集合一定是连续的一段. 当答案方向确定时,则一个向量 ...

  5. 友好的KVO

    更友好的KVO 前言 观察者模式是大家在开发过程中每个人都要使用的一种设计模式,在iOS的开发流程中,KVO则是这一开发模式的主要实践手段,观察一个属性,当属性值发生变化的就能能够拿到这个属性的新.老 ...

  6. Elasticsearch快速入门案例

    写在前面的话:读书破万卷,编码如有神-------------------------------------------------------------------- 参考内容: <Ela ...

  7. ROS知识(16)----如何编译时自动链接同一个工作空间的其他包的头文件(包含message,srv,action自动生成的头文件)

    catkin_make编译时,往往需要自动链接同一个工作空间的其他包的头文件.否则会出现类似如下的错误: /home/xx/xx_ws/srcA_package/src/db.hpp:13:26: f ...

  8. 使用NFS启动Tiny4412开发板根文件系统

      1.Ubuntu14.04上搭建NFS服务 1.1.安装NFS服务 $ sudo apt-get install nfs-kernel-server    //安装NFS服务 1.2 创建Tiny ...

  9. FT232H USB转串口,I2C,JTAG高速芯片

    随着FT232H USB2.0高速芯片的发布,英商飞特蒂亚公司(FTDI)进一步巩固了其在USB接口集成电路产品的地位.此款多功能的单通道USB转UART/FIFO接口设备可通过EEPROM配置为各种 ...

  10. 能够区分光驱的类型么?比如CDROM、DVD还是CD-RW

    http://www.jubao163.com/it/bianchengwendang/2007-06-17/14948.shtml typedef struct _SCSI_PASS_THROUGH ...