教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang笔记——结构体

Golang笔记——结构体

发布时间:2023-02-25   编辑:jiaochengji.com
教程集为您提供Golang笔记——结构体等资源,欢迎您收藏本站,我们将为您提供最新的Golang笔记——结构体资源

结构体

看一个问题

使用现有技术解决

  1. 单独的定义变量解决 代码演示:

  2. 使用数组解决

现有技术解决的缺点分析

  1. 使用变量或者数组来解决养猫的问题,不利于数据的管理和维护。因为名字,年龄,颜色都是 属于一只猫,但是这里是分开保存。
  2. 如果我们希望对一只猫的属性(名字、年龄,颜色)进行操作(绑定方法), 也不好处理。
  3. 引出我们要讲解的技术-》结构体。

一个程序就是一个世界,有很多对象(变量)


Golang 语言面向对象编程说明

  1. Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对 象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。
  2. Golang 没有类(class),Go 语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可 以理解 Golang 是基于 struct 来实现 OOP 特性的。
  3. Golang 面向对象编程非常简洁,去掉了传统 OOP 语言的继承、方法重载、构造函数和析构函 数、隐藏的 this 指针等等
  4. Golang 仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它 OOP 语言不 一样,比如继承 :Golang 没有 extends 关键字,继承是通过匿名字段来实现。
  5. Golang 面向对象(OOP)很优雅,OOP 本身就是语言类型系统(type system)的一部分,通过接口 (interface)关联,耦合性低,也非常灵活。后面同学们会充分体会到这个特点。也就是说在 Golang 中面 向接口编程是非常重要的特性。

结构体与结构体变量(实例/对象)的关系示意图


对上图的说明

  1. 将一类事物的特性提取出来(比如猫类), 形成一个新的数据类型, 就是一个结构体。
  2. 通过这个结构体,我们可以创建多个变量(实例/对象)
  3. 事物可以猫类,也可以是 Person , Fish 或是某个工具类。。。

快速入门-面向对象的方式(struct)解决养猫问题

代码演示

结构体和结构体变量(实例)的区别和联系

通过上面的案例和讲解我们可以看出:

  1. 结构体是自定义的数据类型,代表一类事物.
  2. 结构体变量(实例)是具体的,实际的,代表一个具体变量

结构体变量(实例)在内存的布局(重要!)

如何声明结构体

基本语法

type 结构体名称 struct { 
	field1 type
	field2 type
}

举例:

type Student struct { 
Name string //字段 
Age int //字段 
Score float32
}

字段/属性

基本介绍

  1. 从概念或叫法上看: 结构体字段 = 属性 = field (即授课中,统一叫字段)
  2. 字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型。比如我们前面定 义猫结构体 的 Name string 就是属性

注意事项和细节说明

  1. 字段声明语法同变量,示例:字段名 字段类型

  2. 字段的类型可以为:基本类型、数组或引用类型

  3. 在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值),规则同前面讲的 一样:
    布尔类型是 false ,数值是 0 ,字符串是 “”。 数组类型的默认值和它的元素类型相关,比如 score [3]int 则为[0, 0, 0] 指针,slice,和 map 的零值都是 nil ,即还没有分配空间。
    案例演示:

  4. 不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个, 结构体 是值类型。
    案例:


    画出上面代码的内存示意图:

创建结构体变量和访问结构体字段

  • 方式 1-直接声明
    案例演示: var person Person
    前面我们已经说了。
  • 方式 2-{}
    案例演示: var person Person = Person{}
  • 方式 3-&
    案例: var person *Person = new (Person)
  • 方式 4-{}
    案例: var person *Person = &Person{}
  • 说明:
  1. 第 3 种和第 4 种方式返回的是 结构体指针。
  2. 结构体指针访问字段的标准方式应该是:(*结构体指针).字段名 ,比如 (*person).Name = “tom”
  3. 但 go 做了一个简化,也支持 结构体指针.字段名, 比如 person.Name = “tom”。更加符合程序员 使用的习惯,go 编译器底层 对 person.Name 做了转化 (*person).Name。

struct 类型的内存分配机制

看一个思考题

输出的结果是: p2.Name = tom p1.Name = 小明

基本说明

结构体在内存中示意图

看下面代码,并分析原因

输出的结果是:

上面代码对应的内存图的分析:

结构体使用注意事项和细节

  1. 结构体的所有字段在内存中是连续的

    对应的分析图:
  2. 结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类
    型)
  3. 结构体进行 type 重新定义(相当于取别名),Golang 认为是新的数据类型,但是相互间可以强转
  4. struct 的每个字段上,可以写上一个 tag, 该 tag 可以通过反射机制获取,常见的使用场景就是序 列化和反序列化。
    序列化的使用场景:

    举例:

到此这篇关于“Golang笔记——结构体”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
MySQL中BOOL/BOOLEAN 与 TINYINT 区别 - 测试笔记
常见的导致mysql中文乱码问题
有关 mysql count(*) 与 count(col) 查询效率的比较分析
mysql中replace、regexp正则表达式替换用法
php excel操作类phpExcel用法介绍
mysql修改参数变量设置的一些方法总结
mysql中文乱码问题解决方法总结
专家教你如何有效的学习Drupal - Drupal问答
mysql中利用sql语句来提取分割符
photoshop深度解析蒙版教程

[关闭]
~ ~