美文网首页
go语言结构体怎么用?

go语言结构体怎么用?

作者: 护念 | 来源:发表于2023-07-29 22:23 被阅读0次

在go中结构体相当于面向对象语言中的类,是一个非常非常重要的概念。
既然它相当于类,那么它就有类似类的一些功能,下面我们一起看看。

package main

import (
    "fmt"
)

// 定义Dog结构体——相当于 Dog类
type Dog struct {
    name string // 字段名 - 类型
    age  int
}

// 这个相当于dog的实例方法 —— 在go中也称为方法
// d * Dog 相当于面向对象语言中的self
func (d *Dog) call() {
    fmt.Println("汪汪")
}

func (d *Dog) intro() {
    fmt.Println("name:", d.name, "age:", d.age)
}

func main() {
    d1 := &Dog{name: "小黄", age: 1} // &Dog 和 new(Dog) 都是指针引用的写法
    d2 := new(Dog)                 // 实际项目中&Dog用的多
    d2.name = "小黑"
    d2.age = 2

    d3 := Dog{name: "小柯j", age: 2} // 一般不推荐这样写 这样直接copy结构体
    d4 := &Dog{"小小", 3}            // 不用带字段 安装顺序传入也是ok的

    d1.call()
    d1.intro() // 调用的d1实例上的 intro方法

    d2.intro()
    d3.intro()
    d4.intro()
}

// 输出:

// 汪汪
// name: 小黄 age: 1
// name: 小黑 age: 2
// name: 小柯j age: 2
// name: 小小 age: 3

2. 继承(值类型嵌套)

首先,结构体中的字段类型,是不局限于常规变量(比如: string boolean int 等),也可以是结构体。

go中的继承是通过,内嵌结构体实现的,内嵌后,当前结构体将获得基础结构体字段和方法的能力。

package main

import (
    "fmt"
)

// 建立Animal作为基础类
type Animal struct {
    name string
    age  int
}

func (a *Animal) intro() {
    fmt.Println("name: ", a.name, "age: ", a.age)
}

// Dog类
type Dog struct {
    desc   string
    Animal // 以值类型的方式引入 Animal基础类 这里没有字段,也称匿名字段 此时字段名就是Animal
    // 会将Animal中的字段方法,上升到dog直接可以调用的层度
  
}

func (a *Dog) call() {
    fmt.Println("汪汪")
}

func main() {

    d1 := &Dog{
        Animal: Animal{name: "小黄", age: 1}, // 这里必须以内嵌的方式书写
        desc:   "This is dog!",
    }

    fmt.Println(d1.name)       // 直接调用animal内 name字段
    fmt.Println(d1.age)        // 直接调用animal内 age字段
    fmt.Println(d1.Animal.age) // 这时先找到Animal字段它是一个结构体,然后调用age()
    d1.call()
    d1.intro() // 直接调用animal上的intro方法
}

// 输出:

// 汪汪
// name: 小黄 age: 1
// name: 小黑 age: 2
// name: 小柯j age: 2
// name: 小小 age: 3

3. 指针类型嵌套

指针类型嵌套区别于继承(值类型嵌套),在使用上它会显示多经过一层。

但它有如下好处:

  1. 可以避免大结构体复制,占用大量内存
  2. 可以避免循环引用

下面看具体代码

package main

import "fmt"

// 内部结构体
type Address struct {
    City     string
    Province string
}

// 外部结构体
type Person struct {
    Name    string
    Age     int
    Address *Address // 以指针类型嵌套
}

func main() {
    address := &Address{
        City:     "成都",
        Province: "四川",
    }

    person := &Person{
        Name:    "张三",
        Age:     12,
        Address: address, // 引入前面的address 注意这里是指针
    }

    // 直接访问外部结构体
    fmt.Println("姓名:", person.Name, "年龄:", person.Age)

    // 间接访问内部结构体
    fmt.Println(person.Address.City) // 注意这里多了一层 Address
    fmt.Println(person.Address.Province)

    // fmt.Println(person.City) 这是错误写法 区别于继承(值嵌套)
}

// 输出
// 姓名: 张三 年龄: 12
// 成都
sichuan

相关文章

  • 使用Golang完成的第一个项目

    Go语言和PHP的区别(Go语言特色) 没有类的概念,可以用结构体替代。给结构体定义变量,声明方法。 两个特殊的方...

  • Tank技术【3-6】GoLang语法实战学习(4)

    九、结构体 Go语言的结构体和C语言是类似的。定义结构体如下: 使用结构体有两种办法: 后两个是直接用:=赋值来声...

  • <>

    结构体及其使用方法 结构体的定义 Go语言用嵌入式字段实现了继承吗?? GO语言不存在所谓的继承,只有组合。组合和...

  • golang继承与接口

    继承 结构体 Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继 承...

  • 结构体

    结构体初识 结构体指针 结构体的匿名字段 结构体嵌套 Go语言中的OOP

  • 《Go语言四十二章经》第十八章 Struct 结构体

    《Go语言四十二章经》第十八章 Struct 结构体 作者:李骁 18.1结构体(struct) Go 通过结构体...

  • Go 语言程序设计——面向对象编程(5)

    结构体 Go 语言中创建自定义结构体最简单的方式是基于 Go 语言的内置类型创建 自定义类型也可以基于结构体创建,...

  • Go语言探索 - 10(原创)

    上一篇文章主要学习了Go语言的结构体以及结构体指针,本篇文章主要学习Go语言的切片以及Map。 Go语言数组的长度...

  • Go Struct

    Go语言通过自定义结构的方式来实现新的类型,结构体是类型中带有成员的复合类型。 Go语言使用结构体和结构体成员来描...

  • Golang 学习笔记四 结构体

    一、结构体 《快学 Go 语言》第 8 课 —— 结构体1.结构体类型的定义结构体和其它高级语言里的「类」比较类似...

网友评论

      本文标题:go语言结构体怎么用?

      本文链接:https://www.haomeiwen.com/subject/zwvjpdtx.html