golang第四卷---结构体

参考网站:go结构体

结构体

Go语言可以通过自定义的方式形成新的类型,结构体就是这些类型中的一种复合类型,结构体是由零个或多个任意类型的值聚合成的实体,每个值都可以称为结构体的成员。

结构体成员也可以称为“字段”,这些字段有以下特性:

  • 字段拥有自己的类型和值;
  • 字段名必须唯一;
  • 字段的类型也可以是结构体,甚至是字段所在结构体的类型。

使用关键字== type== 可以将各种基本类型定义为自定义类型,基本类型包括整型、字符串、布尔等。结构体是一种复合的基本类型,通过 type 定义为自定义类型后,使结构体更便于使用。

type 类型名 struct {
   
    字段1 字段1类型
    字段2 字段2类型
    …
}

结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存

实例化

基本的实例化形式:

var ins T //T 为结构体类型,ins 为结构体的实例。

创建指针类型的结构体:

//T 为类型,可以是结构体、整型、字符串等。
//ins:T 类型被实例化后保存到 ins 变量中,ins 的类型为 *T,属于指针。
ins := new(T)

new 实例化的结构体实例在成员赋值上与基本实例化的写法一致。

取结构体的地址实例化:

在Go语言中,对结构体进行&取地址操作时,视为对该类型进行一次 new 的实例化操作,取地址格式如下:

//T 表示结构体类型。
//ins 为结构体的实例,类型为 *T,是指针类型。
ins := &T{
   }

匿名结构体
匿名结构体没有类型名称,无须通过 type 关键字定义就可以直接使用。

ins := struct {
   
    // 匿名结构体字段定义
    字段1 字段类型1
    字段2 字段类型2}{
   
    // 字段值初始化
    初始化字段1: 字段1的值,
    初始化字段2: 字段2的值,}

方法

一个类型加上它的方法等价于面向对象中的一个类

Go 方法是作用在接收器(receiver)上的一个函数,接收器是某种类型的变量,因此方法是一种特殊类型的函数。

接收器类型可以是(几乎)任何类型,不仅仅是结构体类型,任何类型都可以有方法,甚至可以是函数类型,可以是 int、bool、string 或数组的别名类型,但是接收器不能是一个接口类型,因为接口是一个抽象定义,而方法却是具体实现,如果这样做了就会引发一个编译错误invalid receiver type…

在Go语言中,类型的代码和绑定在它上面的方法的代码可以不放置在一起,它们可以存在不同的源文件中,唯一的要求是它们必须是同一个包的。

接收器

func (接收器变量 接收器类型) 方法名(参数列表) (返回参数) {
   
    函数体
}

接收器根据接收器的类型可以分为指针接收器非指针接收器,两种接收器在使用时会产生不同的效果,根据效果的不同,两种接收器会被用于不同性能和功能要求的代码中。

指针类型的接收器:
调用方法时,修改接收器指针的任意成员变量,在方法结束后,修改都是有效的

非指针类型的接收器:
当方法作用于非指针接收器时,Go语言会在代码运行时将接收器的值复制一份,在非指针接收器的方法中可以获取接收器的成员值,但修改后无效。

在计算机中,小对象由于值复制时的速度较快,所以适合使用非指针接收器,大对象因为复制性能较低,适合使用指针接收器,在接收器和参数间传递时不进行复制,只是传递指针

匿名字段

结构体可以包含一个或多个匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型也就是字段的名字。

匿名字段本身可以是一个结构体类型,即结构体可以包含内嵌结构体。

Go语言中的继承是通过内嵌或组合来实现的,所以可以说,在Go语言中,相比较于继承,组合更受青睐。

package main

import "fmt"

type User struct {
   
    id   int
    name string
}

type Manager struct {
   
    User
}

func (self *User) ToString() string {
    // receiver = &(Manager.User)
    return fmt.Sprintf("User: %p, %v", self, self)
}

func main() {
   
    m := Manager{
   User{
   1, "Tom"}}
    fmt.Printf("Manager: %p\n", &m)
    fmt.Println(m.ToString())
}

类似于重写的功能:

package main

import "fmt"

type User struct {
   
    id   int
    name string
}

type Manager struct {
   
    User
    title string
}

func (self *User) ToString() string {
   
    return fmt.Sprintf("User: %p, %v", self, self)
}

func (self *Manager) ToString() string {
   
    return fmt.Sprintf("Manager: %p, %v", self, self)
}

func main() {
   
    m := Manager{
   User{
   1, "Tom"}, "Administrator"}

    fmt.Println(m.ToString())

    fmt.Println(m.User.ToString())
}

相关推荐

  1. golang---结构

    2023-12-31 04:20:03       63 阅读
  2. golang学习-结构

    2023-12-31 04:20:03       50 阅读
  3. golang---go中的数据结构

    2023-12-31 04:20:03       63 阅读
  4. Golang 语法系列:结构

    2023-12-31 04:20:03       51 阅读
  5. Golang gorm 结构定义使用

    2023-12-31 04:20:03       46 阅读
  6. golang学习笔记——结构嵌套接口

    2023-12-31 04:20:03       32 阅读
  7. golang学习-golang结构和Json相互转换

    2023-12-31 04:20:03       57 阅读
  8. 初识GolangGolang 中的结构和方法

    2023-12-31 04:20:03       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-31 04:20:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-31 04:20:03       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-31 04:20:03       82 阅读
  4. Python语言-面向对象

    2023-12-31 04:20:03       91 阅读

热门阅读

  1. vue中父子组件传值

    2023-12-31 04:20:03       58 阅读
  2. 运维工程师的出路到底在哪里?

    2023-12-31 04:20:03       61 阅读
  3. 面试算法:归并排序

    2023-12-31 04:20:03       63 阅读
  4. mysql容器中,中文乱码或输入不了中文

    2023-12-31 04:20:03       59 阅读
  5. recognize-anything 识别万物

    2023-12-31 04:20:03       58 阅读
  6. 侵入式和非侵入式微服务框架的比较

    2023-12-31 04:20:03       51 阅读