关于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框架程序设计

(美)Jeffrey Richter、(美)Francesco Balena / 李建忠 / 华中科技大学出版社 / 2004-1 / 54.00元

Microsoft.NET框架为简化开发与卫联网无缝连接的应用程序和组件提供了强大的技术支持,如ASP.NET Web窗体、XML Web服务以及Windows窗体。本书的目的在于展示.NET框架中公共语言运行库存的核心内容。全书由两位广受尊敬的开发者/作者完成,并假设读者理解面向对象程序设计的基本概念,如数据抽象、继承和多态。书中内容清楚地解释了CLR的扩展类型系统,CLR如何管理类型的行为,以......一起来看看 《.NET框架程序设计》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具