Go语言中结构体的使用-第2部分OOP

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

内容简介:结构体的基本语法请参见:在面向对象编程中,实例化对象时往往需要完成很多业务逻辑,例如初始数据合理性,获取需要的资源等。在经典的OOP程序中,都会提供构造方法,用于在实例化对象时完成特定功能。 Go语言中,没有class,因此没有典型意义的构造方法。但我们可以定义一个函数,用来实例化结构体对象,在函数内完成特定功能,实现构造函数的功能,这就是构造工厂函数。演示如下:注意,在OOP编程中,通常认为对象是引用用传递,因此我们的构造函数返回的是

1 概述

结构体的基本语法请参见: Go语言中结构体的使用-第1部分结构体 。 结构体除了是一个复合数据之外,还用来做面向对象编程。Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性。也就意味着结构体类型可以类比为其他语言中的“类class”, 而结构体数据可以类比为其他语言中的 “对象”。 本文就说说结构体中,面向对象的部分。

2 构造工厂函数

在面向对象编程中,实例化对象时往往需要完成很多业务逻辑,例如初始数据合理性,获取需要的资源等。在经典的OOP程序中,都会提供构造方法,用于在实例化对象时完成特定功能。 Go语言中,没有class,因此没有典型意义的构造方法。但我们可以定义一个函数,用来实例化结构体对象,在函数内完成特定功能,实现构造函数的功能,这就是构造工厂函数。演示如下:

type Product struct {
    Name  string
    Price float64
}
func NewProduct(name string, price float64) *Product {
    // 此处完成初始化业务逻辑

    // 得到Product对象
    return ∏{
        Name: name,
        Price: price,
    }
}

// 需要 Product 对象时:
p := NewProduct("ThinkPad T480", 8008)

注意,在OOP编程中,通常认为对象是引用用传递,因此我们的构造函数返回的是 *Product 同时函数内使用 &Product ,这样得到的对象为引用传递(Go语言对结构体类型自动解析引用)。

3 成员方法(接收器)

若要为成员增加方法,需要在函数上定义接收器,用来接收调用该方法的成员对象。接收器定义如下:

func (p *Product) Sale() {
  fmt.Println("Product: ", p.name, " is on Sale")
}

语法中, (p *Product) 就是接收器。通过定义可知,该接收器可以让函数接受一个 *Product 类型的参数,也就是调用该函数的对象。调用方法为:

pro := ∏{
  name: "ThinkPad T480"
}
// 当作成员去调用
// 调用时,将调用函数的 pro,作为参数传递给函数 Run 的接收器 m。这样就可以访问 pro 对象了。
pro.Sale()

同样,面向对象中对象通常为引用类型,因此接收器的定义也是 *Product 的引用类型。

4 继承,内嵌结构体

Go语言中结构体对象间的继承,通过内嵌结构体语法实现。演示:

type Product struct {
    Name  string
    Price float64
}
func (p *Product) Sale() {
  fmt.Println("Product: ", p.name, " is on Sale")
}
type Book struct {
  // 嵌入Product结构体
  Product
  Author string
  Publish string
}

定义 Book 时,内嵌了 Product 结构体。其中 Book 称为子结构体(派生,扩展),Product成为父结构体(基础)。实例化的 Book 结构体对象,可以直接访问 Product 结构体中定义的成员包括属性和方法。演示:

v := &Book{}
// 访问内嵌结构体属性
v.Name = "笑傲江湖"
v.Author = "金庸"
// 调用内嵌结构体方法
v.Sale()

内嵌还支持: 多继承 ,可以同时内嵌多个结构体,称之为多继承。但要保证所继承的结构体间没有同名成员,否则出错。

间接访问 ,字结构体对象支持通过父结构体对象访问继承的成员,语法为 v.Product.Name ,效果与 v.Name 一致。可以理解为是一种快捷语法。

直接初始化 ,可以直接为内嵌结构体提供初始化操作。演示为:

p := &Book{
  Product: ∏{
    Name: "天龙八部"
    Price: 42.8
  }
  Author: "金庸"
}

5 重写,override

在内嵌继承中,若子与父结构体存在同名成员,实例化的子结构体成员,访问到的是字结构体定义的成员。这个现象称之为重写override。演示:

type Product struct {
    Name  string
    Price float64
}
func (p *Product) Sale() {
  fmt.Println("Product: ", p.name, " is on Sale")
}
type Book struct {
  // 嵌入Product结构体
  Product
  Author string
  Publish string
  Price float64
}
v := &Book{}
// 访问内嵌结构体属性
// 以下代码访问的是 Book 中定义的 Price 属性
v.Price = 42.8
// 测试:
fmt.Println(v.Product.Price) // 结果为 0

注意,继承是一个 查找 过程。先在当前结构体对象中查找,如果没有向内嵌结构体中查找,直到最内层内嵌结构体。重写就是由于在当前结构体对象中查找到了,就不需要再去嵌入结构体对象中查找了,不是一个成员替换过程。

结构体,实例化,继承,重写示意图如下: Go语言中结构体的使用-第2部分OOP

以上就是结构体提供的关于OOP中的语法。OOP编程还会涉及到接口,反射等技术。

结构体第二部分完! 原文出自: 小韩说课 微信关注:小韩说课 Go语言中结构体的使用-第2部分OOP


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

网络机器人Java编程指南

网络机器人Java编程指南

美 Heaton J. / 电子工业出版社 / 2002-7 / 44.00元

这是一本研究如何实现具有Web访问能力的网络机器人的书。该书从Internet编程的基本原理出发,深入浅出、循序渐进地阐述了网络机器人程序Spider、Bot、Aggregator的实现技术,并分析了每种程序的优点及适用场合。本书提供了大量的有效源代码,并对这些代码进行了详细的分析。通过本书的介绍,你可以很方便地利用这些技术,设计并实现网络蜘蛛或网络信息搜索器等机器人程序。 适合于具有一起来看看 《网络机器人Java编程指南》 这本书的介绍吧!

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

RGB HEX 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具