编辑
2024-05-31
🧰语言-go
00
请注意,本文编写于 384 天前,最后修改于 225 天前,其中某些信息可能已经过时。

目录

接口定义
结构体定义
结构体初始化
结构体与指针
结构体自引用
衍生类型
类型别名
结构体实现接口
组合
组合的特性

接口定义

基本语法: type 名字 interface{}

  • 里面只能有方法,方法也不需要func关键字

什么是接口?:接口是一组行为的抽象

  • 尽量用接口,以实现面向接口编程

原则上任务:即便是任务开发,也应该面向接口编程

image.png

当你怀疑要不要定义接口的时候,加上去。

结构体定义

  • 基本语法:
go
type Name struct{ fieldName FieldType //.... }

image.png 结构体和结构体的字段都遵循大小写控制访问性的原则。

通过. 这个符号来访问字段或者方法。

结构体初始化

  • Go没有构造函数
  • 初始化语法:struct{}
  • 获取指针
    • &struct {}
    • new(Struct)

new可理解为Go会为你的变量分配内存,并且把内存都置为0.

image.png

有两种形态:

  • 按照字段名赋值
  • 按照字段顺序赋值:不推荐使用,非常不利于后期维护

image.png

结构体与指针

go的指针和别的语言的概念一样,本质上都是一个内存地址。

  • 和c、c++一样,*表示指针,&取地址
  • 如果声明了一个指针,但是没有赋值,那么他是nil。

image.png

方法接收器

一个方法可以定义在这个结构体上,也可以定义在这个结构体的指针上。

前者叫做结构体接收器,后者叫做指针接收器。

image.png

结构体接收器内部修改字段,不会生效。因为方法调用本身是值传递的。

目前没有统一的说法什么时候用什么接收器,你在初学的时候:遇事不决用指针。

也就是:

  • 如果是基本类型,结构体,那么就相当于复制一份了
  • 如果是指针,那么就复制了一份指针(也就是地址),但是指向的结构体还是同一个
  • 内置类型复制了一份,但是他们的内部数据结构,还是同一个。(初学你就可以这么理解)

image.png

结构体自引用

如果在结构体内部还要引用自身,那么只能使用指针。

准确来说,在整个引用链上,如果构成循环,那就只能用指针。

如果引用链路很长,你比较难发现这种错误。

image.png

衍生类型

  • 基本语法: type typeA type B

我一般在想使用第三方库,又没有办法修改远吗,又想扩展整个库的结构体的方法的情况下,就用这个。

记住衍生核心:衍生类型是一个全新的类型。

衍生类型可以互相转换,使用()进行转换

注意:typeB实现了某个接口,不等于TypeA也实现了某个接口

image.png

类型别名

  • 基本语法: type TypeA=Type B
    • 别名,除了换了一个名字,没有任何区别
    • 他和衍生类型的区别就是用了=

类型别名一般用在导出类型、兼容性修改里面,也不常见。

image.png

结构体实现接口

当看到某个东西走起来像鸭子、有勇气来像鸭子、饺子来也像鸭子,那么这个东西就被称为鸭子。

当一个结构体具备的接口的所有方法的时候,他就实现了这个接口。

image.png

组合

组合是go里面独有的语法概念,基本语法形态是:

go
type A struct{ B }

组合可以是以下几种情况:

  • 接口组合接口
  • 结构体组合结构体
  • 结构体组合结构体指针
  • 结构体组合接口

可以组合多个。

image.png

组合的特性

  • 当A组合了B之后

    • 可以直接在A上调用B的方法
    • B实现的所有接口,都认为A已经实现了
  • A组合B之后,在初始化A的时候将B看做普通字段来初始化

  • 组合不是继承,没有多态

右边的例子输出什么?

  • hello,inner
  • hello,outer

image.png

本文作者:Eric

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!