005 GO-高级数据类型(结构体和方法)

http://note.youdao.com/noteshare?id=864cc29d2ca6082949d875280f3f5448&sub=D4DF745BF9DE4FADA5A056E2F8DA0B8F

自我理解:

结构体更像类的定义(可以有属性和方法)

一、结构体定义

Go语言的结构体类型(Struct)比函数类型更加灵活。它可以封装属性和操作。前者即是结构体类型中的字段,而后者则是结构体类型所拥有的方法。

  • 可以封装属性和函数
  • 函数封装在 结构体内,即为结构体的方法。

二、结构体声明

结构体类型的字面量由关键字type、类型名称、关键字struct,以及由花括号包裹的若干字段声明组成。其中,每个字段声明独占一行并由字段名称(可选)和字段类型组成。示例如下:

type Person struct { Name string Gender string Age uint8 }

三、结构体值类型创建——结构体的值

Person{Name: "Robert", Gender: "Male", Age: 33}

或者

(值的顺序 如果和 值)

Person{"Robert", "Male", 33}

当然,我们在编写某个结构体类型的值字面量时可以只对它的部分字段赋值,甚至不对它的任何字段赋值。这时,未被显式赋值的字段的值则为其类型的零值。注意,在上述两种情况下,字段的名称是不能被省略的。

例如:

// 忽略的字段为 0 或 空 fmt.Println(Books{title: "Go 语言", author: "www.runoob.com"})

四、创建匿名结构体

我们依照结构体类型Person创建一个匿名结构体:

p := struct { Name string Gender string Age uint8 }{"Robert", "Male", 33}

匿名结构体的用途:

匿名结构体最大的用处就是在内部临时创建一个结构以封装数据,而不必正式为其声明相关规则。而在涉及到对外的场景中,我强烈建议使用正式的结构体类型。

五、结构体方法定义

结构体类型可以拥有若干方法(注意,匿名结构体是不可能拥有方法的)。所谓方法,其实就是一种特殊的函数。它可以依附于某个自定义类型。方法的特殊在于它的声明包含了一个接收者声明。这里的接收者指代它所依附的那个类型。我们仍以结构体类型Person为例。下面是依附于它的一个名为Grow的方法的声明:

func (person *Person) Grow() { person.Age++ }

说明:   如上所示,在关键字func和名称Grow之间的那个圆括号及其包含的内容就是接收者声明。其中的内容由两部分组成。第一部分是代表它依附的那个类型的值的标识符。第二部分是它依附的那个类型的名称。后者表明了依附关系,而前者则使得在该方法中的代码可以使用到该类型的值(也称为当前值)

  • 注意,这里的接收类型是 *Person 而不是 Person

5.1特点:

  • 1、方法是特殊的函数,依附于某个自定义类型(结构体)
  • 2、声明中包含了接收者声明。这里的接收者指代它所依附的那个类型。
  • 3、如上所示:Gorw的方法 依附于 Person 结构体

5.2 机构体方法调用

p := Person{"Robert", "Male", 33} p.Grow()

5.3 注意-接受类型

需要注意的是,在Grow方法的接收者声明中的那个类型是*Person,而不是Person。实际上,前者是后者的指针类型。这也使得person指代的是p的指针,而不是它本身。至于为什么这么做,我们在讲指针的时候在予以揭晓。

5.4 结构体类型没有继承

包含若干字段和方法的结构体类型就相当于一个把属性和操作封装在一起的对象。不过要注意,与对象不同的是,结构体类型(以及任何类型)之间都不可能存在继承关系。

实际上,在Go语言中并没有继承的概念。不过,我们可以通过在结构体类型的声明中添加匿名字段(或称嵌入类型)来模仿继承。具体细节可以参考《Go并发编程实战》中的说明,或者关注我的后续课程。

5.5 结构体类型属于值类型,其零值 不是 nil 而是其中属性的相应类型的零值。

举个例子,结构体类型Person的零值若用字面量来表示的话则为Person{}

六、结构体指针

结构体指针

你可以定义指向结构体的指针类似于其他指针变量,格式如下:

var struct_pointer *Books

以上定义的指针变量可以存储结构体变量的地址。查看结构体变量地址,可以将 & 符号放置于结构体变量前:

struct_pointer = &Book1;

使用结构体指针访问结构体成员,使用 "." 操作符:

struct_pointer.title;

七、练习题

package main

import "fmt"

type Person struct {

Name string

Gender string

Age uint8

Address string

}

func (p *Person) Move(newAddress string) string {

oldAddress := p.Address

p.Address = newAddress

return oldAddress

}

func main() {

p := Person{"Robert", "Male", 33, "Beijing"}

oldAddress := p.Move("San Francisco")

fmt.Printf("%s moved from %s to %s.\n", p.Name, oldAddress, p.Address)

}

005 GO-高级数据类型(结构体和方法)相关推荐

  1. C 语言编程 — 高级数据类型 — 结构体与位域

    目录 文章目录 目录 前文列表 结构体 定义结构体 初始化结构体变量 访问结构体成员 结构体的内存分布 将结构体作为实参传入函数 指向结构体变量的指针 位域 定义位域 使用位域结构体的成员 前文列表 ...

  2. Go 语言编程 — 高级数据类型 — 结构体

    目录 文章目录 目录 结构体 访问结构体成员 向函数传递结构体 结构体指针 结构体标签(Struct Tag) 结构体 Golang 中,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.与 ...

  3. C 语言编程 — 高级数据类型 — 共用体

    目录 文章目录 目录 前文列表 共用体 定义共用体 访问共用体成员 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本 ...

  4. c++中的构造数据类型----结构体

    c++中的构造数据类型----结构体 构造数据类型: 无论是基本数据类型还是数组类型都仅仅描述了事物某一方面的特性, 但是, 一种事物往往具有多方面的属性, 如一个同学有学号, 姓名, 性别, 年龄等 ...

  5. python高级ctypes数据类型—结构体

    结构体在ctypes中通过类进行定义.用于定义结构体的类需要继承自ctypes的Structure基类,而后通过定义类的_fields_属性来定义结构体的构成._fields_属性一般定义为一个二维的 ...

  6. 【Go】Go基础(八):结构体和方法

    一. 结构体(struct) 1.结构体定义 type identifier struct {field1 type1field2 type2... } 声明:new(Type) 和 &Typ ...

  7. [Go]结构体及其方法

    结构体类型可以包含若干字段,每个字段通常都需要有确切的名字和类型.也可以不包含任何字段,这样并不是没有意义的,因为还可以为这些类型关联上一些方法,这里可以把方法看作事函数的特殊版本. 函数事独立的程序 ...

  8. go在方法中修改结构体的值_[Go]结构体及其方法

    结构体类型可以包含若干字段,每个字段通常都需要有确切的名字和类型.也可以不包含任何字段,这样并不是没有意义的,因为还可以为这些类型关联上一些方法,这里可以把方法看作事函数的特殊版本. 函数事独立的程序 ...

  9. C读取配置文件,然后写入结构体的方法

    方法一: #include<stdio.h> #include<stdlib.h> #include<string.h>#define MAX 4096 #defi ...

最新文章

  1. java 类定义_JAVA类与对象(二)----类定义基础
  2. 【Flutter】Flutter 布局组件 ( FractionallySizedBox 组件 | Stack 布局组件 | Positioned 组件 )
  3. C语言程序设计 练习1-13
  4. 应届硕士研究生算法岗秋招总结
  5. 通信 / HTTP Host 请求头的作用
  6. CS-- WebService、 windowsService
  7. SQL解析和优化器获得重大思路进展
  8. SetWindowsHookEx 其他进程的 记录
  9. [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  10. 小程序源码:全新外卖侠cps5.6全套微信小程序源码下载(内附加2.7.5版本微擎)支持多种CPS收益和流量主收益
  11. VMware vSphere Client5.0与 Windows8不再有问题,解决VMware 5.0 客户端提示VMRC控制台的连接已断开
  12. 利用WPS的Excel制作项目进度表
  13. 神舟笔记本进入BIOS的方法
  14. 计算机第二学期末考试题,离散数学期末考试试题及答案
  15. 安全模块之FIPS 140-2标准和国密标准对比
  16. beeline常用命令
  17. 【HDOJ】1814 Peaceful Commission
  18. 打造类手机刷机的win10 recovery镜像
  19. 微信小程序在线点餐外卖小程序实现方法适合校园点餐毕业设计小程序(含代码解释)
  20. 生活记录:其实超度的是活着的人

热门文章

  1. 这有2T的无损音乐,感谢发布者 http://www.everbox.com/f/mKqJ211fRAFY183t9RYOEXMzDp
  2. 用网盘(dropbox,kuaipan,everbox)保管的git repository
  3. 北大计算机科学系王腾蛟,本系简介
  4. 十大黑客电影-关于程序员或者关于电脑高手的电影
  5. H+ Se7en WebUI
  6. 重温士兵突击之后 职场风云
  7. GPU加速在前端的应用
  8. Centos8 安装 MySQL8.0.26
  9. 马士兵 java 学习笔记_马士兵java教程笔记1
  10. HTML网页设计基础期末作业——仿Coco线上订奶茶饮料网站设计与实现6个页面(HTML+CSS+JavaScript)...