Go语言中结构体的高级技巧分享

 更新时间:2023年08月27日 16:17:13   作者:周小末天天开心  
这篇文章主要为大家分享一下Go语言中结构体的高级技巧,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起了解一下

组合结构体

Go语言中的结构体也可以通过组合来实现复用的功能,具体实现方法如下:

type Person struct {
    Name string
    Age  int
}
type Student struct {
    P      Person // 组合了Person结构体
    School string
}
func main() {
    s := Student{Person{"Tom", 18}, "High School"}
    fmt.Println(s.P.Name, s.P.Age, s.School) // 输出 Tom 18 High School
}

这段代码中定义了一个Person结构体,包含Name和Age两个字段,另外定义了一个Student结构体,它组合了Person结构体。在main函数中,我们通过构造函数创建了一个Student实例s,并访问了它的Name、Age和School字段,需要通过s.P来访问Person结构体中的字段。

通过组合其他结构体,子结构体可以复用父结构体中的字段和方法,但是它不会继承父结构体的特性和行为。与继承相比,组合更加灵活和简单,但也需要开发者更多的手动操作。

需要注意的是,Go语言中没有类的概念,因此结构体不是类,它不能实现继承和多态等面向对象的特性,而是一种数据类型的定义方式。

嵌套结构体

可以在结构体中嵌套另一个结构体,从而形成一个复合的结构体类型。嵌套结构体可以直接使用内部结构体的字段,也可以通过内部结构体名来访问内部结构体的字段。

例如:

type Address struct {
    Province string
    City     string
}
type Person struct {
    Name    string
    Age     int
    Address Address
}
p := Person{Name: "Tom", Age: 18, Address: Address{Province: "Beijing", City: "Chaoyang"}}
fmt.Println(p.Name, p.Age, p.Address.Province, p.Address.City)

指针结构体

结构体变量通常会占用比较大的内存空间,为了节省内存,可以使用指针结构体。指针结构体可以通过&操作符获取结构体变量的地址,并通过*操作符访问结构体变量的值。

例如:

type Person struct {
    Name string
    Age  int
}
p := &Person{Name: "Tom", Age: 18}
fmt.Println((*p).Name, (*p).Age) // 输出:Tom 18
fmt.Println(p.Name, p.Age)       // 输出:Tom 18

匿名字段

可以将一个结构体类型作为另一个结构体类型的字段,这个字段就称为匿名字段。匿名字段的类型可以是任意类型,可以是基本类型、结构体类型、指针类型等。匿名字段可以直接访问内部结构体的字段,也可以通过内部结构体名来访问内部结构体的字段。

例如:

type Address struct {
    Province string
    City     string
}
type Person struct {
    Name string
    Age  int
    Address
}
p := Person{Name: "Tom", Age: 18, Address: Address{Province: "Beijing", City: "Chaoyang"}}
fmt.Println(p.Name, p.Age, p.Province, p.City)

面向对象

Go语言虽然不是一种纯面向对象编程语言,但它提供了一些面向对象编程的基本特性,比如封装、继承和多态等。

封装

Go语言通过大写字母开头的字段或方法来实现封装,这些字段或方法可以在包外部访问。小写字母开头的字段或方法则只能在当前包内部访问。

例如:

package main
import "fmt"
type Person struct {
    name string
    age int
}
func (p *Person) SayHello() {
    fmt.Println("Hello, my name is", p.name, ", I'm", p.age, "years old.")
}
func main() {
    p := &Person{"Tom", 18}
    p.SayHello()
}

在上面的代码中,我们定义了一个名为Person的结构体,它有两个字段name和age,并且定义了一个方法SayHello,用于打印个人信息。在main函数中,我们创建了一个Person对象p,并调用它的SayHello方法,输出了它的信息。

继承

Go语言不支持传统的继承方式,但是可以通过结构体组合的方式实现继承。具体来说,我们可以在一个结构体中包含另一个结构体,并通过嵌套结构体的方式来继承其字段和方法。

例如:

package main
import "fmt"
type Person struct {
    name string
    age  int
}
func (p *Person) SayHello() {
    fmt.Println("Hello, my name is", p.name, ", I'm", p.age, "years old.")
}
type Student struct {
    Person
    score int
}
func main() {
    s := &Student{Person{"Tom", 18}, 90}
    s.SayHello()
    fmt.Println("My score is", s.score)
}

在上面的代码中,我们定义了两个结构体Person和Student,Student结构体包含了一个Person类型的字段,并且定义了一个自己的score字段。在main函数中,我们创建了一个Student对象s,并调用它的SayHello方法,输出了它的信息,然后输出了它的成绩。

多态

Go语言不支持传统的多态方式,但是可以通过接口实现多态。具体来说,我们可以定义一个接口,并让不同的结构体实现这个接口,从而实现多态。

例如:

package main
import "fmt"
type Animal interface {
    Say()
}
type Cat struct{}
func (c *Cat) Say() {
    fmt.Println("Meow!")
}
type Dog struct{}
func (d *Dog) Say() {
    fmt.Println("Woof!")
}
func main() {
    var a Animal
    a = &Cat{}
    a.Say()
    a = &Dog{}
    a.Say()
}

这段Go语言代码定义了一个Animal接口和两个实现了该接口的结构体:Cat和Dog。Animal接口中只有一个Say()方法。Cat和Dog分别实现了Say()方法并输出相应的声音。在main函数中,定义了一个a变量,类型为Animal接口。首先将a赋值为一个Cat结构体的指针,然后调用a的Say()方法输出"Meow!"。接着将a赋值为一个Dog结构体的指针,再次调用a的Say()方法输出"Woof!"。

到此这篇关于Go语言中结构体的高级技巧分享的文章就介绍到这了,更多相关Go结构体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang爬虫colly 发送post请求

    golang爬虫colly 发送post请求

    本文主要介绍了golang爬虫colly 发送post请求实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Golang 实现分片读取http超大文件流和并发控制

    Golang 实现分片读取http超大文件流和并发控制

    这篇文章主要介绍了Golang 实现分片读取http超大文件流和并发控制,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang使用sync.singleflight解决热点缓存穿透问题

    golang使用sync.singleflight解决热点缓存穿透问题

    在go的sync包中,有一个singleflight包,里面有一个 singleflight.go文件,代码加注释,一共200行出头,通过 singleflight可以很容易实现缓存和去重的效果,避免重复计算,接下来我们就给大家详细介绍一下sync.singleflight如何解决热点缓存穿透问题
    2023-07-07
  • 深入理解golang的异常处理机制

    深入理解golang的异常处理机制

    Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,下面这篇文章主要给大家介绍了关于golang的异常处理机制,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • Golang为什么占用那么多的虚拟内存原理解析

    Golang为什么占用那么多的虚拟内存原理解析

    这篇文章主要介绍了Golang为什么占用那么多的虚拟内存原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go设计模式之单例模式图文详解

    Go设计模式之单例模式图文详解

    单例模式是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点,本文就通过图文给大家介绍一下Go的单例模式,需要的朋友可以参考下
    2023-07-07
  • go实现限流功能示例

    go实现限流功能示例

    这篇文章主要为大家介绍了go实现限流功能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go语言实现Snowflake雪花算法

    Go语言实现Snowflake雪花算法

    雪花算法产生的背景当然是twitter高并发环境下对唯一ID生成的需求,得益于twitter内部牛的技术,雪花算法能够流传于至今并且被广泛使用,本文就详细的介绍一下,感兴趣的可以了解一下
    2021-06-06
  • 深入Golang的接口interface

    深入Golang的接口interface

    这篇文章主要介绍了深入Golang的接口interface,go不要求类型显示地声明实现了哪个接口,只要实现了相关的方法即可,编译器就能检测到,接下来关于接口interface的相关介绍需要的朋友可以参考下面文章内容
    2022-06-06
  • gin 获取post请求的json body操作

    gin 获取post请求的json body操作

    这篇文章主要介绍了gin 获取post请求的json body操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03

最新评论