关于golang中struct的一些理解

栏目: Go · 发布时间: 6年前

内容简介:Go语言中,struct是一个非常重要的概念,它既是一种数据类型,也可以结合方法(一种特殊的函数),构建类似于OOP的类。不多说,先上这段代码中:Go语言虽然没有类的概念,但通过struct类型、匿名字段、方法和接口,简单地实现了类似于OOP中类、方法、继承等概念。

概述

Go语言中,struct是一个非常重要的概念,它既是一种数据类型,也可以结合方法(一种特殊的函数),构建类似于OOP的类。不多说,先上 代码

package main

import (
    "fmt"
)

type A struct {
    Name string
}
type B struct {
    *A //匿名字段,以指针方式引用结构A
}
type C struct {
    B //定义匿名字段,以值方式引用结构B
}

type Interfacer interface {
    Get() string
    Set(v string)
}

// 构建一个结构B
func NewB() *B {
    var a = &A{}
    return &B{A: a}
}
// 实现Interfacer中的Get
func (b *B) Get() string {
    return b.A.Name
}

// 实现Interfacer中的Set
func (b *B) Set(v string) {
    b.A.Name = v
}

func (b *B) Do() {
    if b.A.Name == "" {
        fmt.Println("Name is null.")
        return
    }
    fmt.Printf("Hello, %s.\n", b.A.Name)
}

var _ Interfacer = new(B)

func TestImpl(i Interfacer) {
    i.Set("changed")
    fmt.Println("Get a name: " + i.Get())
}

func main() {
    // 验证结构B
    b1 := NewB()
    b1.Do()
    // 普通的赋值方法
    b1.Name = "test"
    b1.Do()

    b2 := NewB()
    b2.Set("sail")
    b2.Do()

    // 另一种结构赋值方法
    b3 := B{A: &A{Name: "oly"}}
    b3.Do()
    TestImpl(&b3)
    b3.Do()

    var c C
    c.A = &A{Name:"first"}
    c.Name = "sam"
    c.B.Do()
    TestImpl(&c.B)
    c.Set("other1")
    c.Do()
    c.B.Set("other2")
    c.B.Do()
}

我的一些理解

这段代码中:

  • 定义了A、B、C三个struct类型,一个Interfacer接口
  • 结构A的作用主要是一个数据结构
  • 结构B的作用相当于一个类,拥有Do()方法,并实现了Interfacer接口的Get和Set
  • 结构C的作用相当于继承于B(B也相当于继承A)
  • 结构B以指针的方式匿名引用了结构A,可以用 b.Name = "some_name" 来赋值
  • 结构C以值的方式匿名引用了结构B,可以用 c.Do() 来调用B中的方法,由于B又匿名引用了A,还可以用 c.Name = "sam" 来赋值
  • 由于结构B是以 (b *B) 指针方式来实现接口Interfacer的,所以必须以指针方式来调用函数 TestImpl(&b)
  • golang与 ruby 类似,接口特性是ducking type,即“如果它走起来像鸭子,叫起来像鸭子(实现了接口要的方法),它就是一只鸭子(可以被赋值给接口的值)”。所以把&b作为参数传入到函数 TestImpl() 中,一点问题没有。

结论

Go语言虽然没有类的概念,但通过struct类型、匿名字段、方法和接口,简单地实现了类似于OOP中类、方法、继承等概念。


以上所述就是小编给大家介绍的《关于golang中struct的一些理解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

.net之美

.net之美

张子阳 / 机械工业出版社 / 2014-1-1 / 79

本书是.NET 程序员进阶修炼的必读之作,由拥有多年开发经验的资深.NET 技术专家对C# 和.NET 中实用的、关键的和难以理解的知识点进行了深入解析,旨在帮助读者在尽可能短的时间内以 尽可能低的学习成本去掌握那些最应该被掌握的知识。书中的每个知识点都辅之以精心设计的案例,易 于理解,实践性强。 全书共17 章,分为两个部分:第一部分(1~5 章)主要讲解了C# 语言中的一些关键知识点,如......一起来看看 《.net之美》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具