`

golang面向对象思想和实现

 
阅读更多

golang中并没有明确的面向对象的说法,实在要扯上的话,可以将struct比作其它语言中的class。

类声明

type Poem struct {
	Title  string
	Author string
	intro  string
}

这样就声明了一个类,其中没有public、protected、private的的声明。golang用另外一种做法来实现属性的访问权限:属性的开头字母是大写的则在其它包中可以被访问,否则只能在本包中访问。类的声明和方法亦是如此。

类方法声明

func (poem *Poem) publish() {
	fmt.Println("poem publish")
}

或者

func (poem Poem) publish() {
	fmt.Println("poem publish")
}

和其它语言不一样,golang声明方法和普通方法一致,只是在func后增加了poem *Poem这样的声明。加*和没有加*的区别在于一个是传递指针对象,一个是传递值对象。

实例化对象

实例化对象有好几种方式

	poem := &Poem{}
	poem.Author = "Heine"
	poem2 := &Poem{Author: "Heine"}
	poem3 := new(Poem)
	poem3.Author = "Heine"
	poem4 := Poem{}
	poem4.Author = "Heine"
	poem5 := Poem{Author: "Heine"}

实例化的时候可以初始化属性值,如果没有指明则默认为系统默认值

加&符号和new的是指针对象,没有的则是值对象,这点和php、java不一致,在传递对象的时候要根据实际情况来决定是要传递指针还是值。

tips:当对象比较小的时候传递指针并不划算。

构造函数

查看官方文档,golang并没有构造函数一说。如果一定要在初始化对象的时候进行一些工作的话,可以自行封装产生实例的方法。

func NewPoem(param string, p ...interface{}) *Poem

示例:

func NewPoem(author string) (poem *Poem) {
	poem = &Poem{}
	poem.Author = author
	return
}

poem6 := NewPoem("Heine")

继承

确切的说golang中叫做组合(composition)

type Poem struct {
	Title  string
	Author string
	intro  string
}

type ProsePoem struct {
	Poem
	Author string
}

ProsePoem属性中声明了Poem,表示组合了Poem的属性和方法。可以像如下方式调用:

	prosePoem := &ProsePoem{}
	prosePoem.author = "Heine"

如果其中属性有冲突,则以外围的为主。

type ProsePoem struct {
	Poem
	Author string
}

当访问Author的时候默认为ProsePoem的Author,如果需要访问Poem的Author属性可以使用prosePoem.Poem.Author来访问。

prosePoem := &ProsePoem{}
prosePoem.Author = "Shelley"
prosePoem.Poem.Author = "Heine"
fmt.Println(prosePoem)

从输出中可以很直观看到这一点。

&{{ Heine } Shelley}

方法的继承和属性一致,这里不再罗列。通过组合的话可以很好的实现多继承。

方法重载

方法重载就是一个类中可以有相同的函数名称,但是它们的参数是不一致的,在java、C++中这种做法普遍存在。golang中如果尝试这么做会报重新声明(redeclared)错误,但是golang的函数可以声明不定参数,这个非常强大。

func (poem *Poem) recite(v ...interface{}) {
	fmt.Println(v)
}

其中v …interface{}表示参数不定的意思,其中v是slice类型,fmt.Println方法也是这样定义的。如果要根据不同的参数实现不同的功能,要在方法内检测传递的参数。

接口

关于面向对象中还一个重要的东西就是接口了,golang中的接口和其它语言都不太一样,是golang值的称道设计之一。详细了解接口还需要一段时间,下次再分享吧。

完整的示例代码下载:golang面向对象示例代码

<!-- 336x280 --> <iframe id="aswift_1" style="left: 0px; top: 0px; position: absolute;" name="aswift_1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="336" height="280"></iframe>

转载请注明:快乐编程 » golang面向对象思想和实现

分享到:
评论

相关推荐

    桫哥-GOlang-05面向对象

    总的来说,"桫哥-GOlang-05面向对象"课程将带领你学习如何在Go语言中运用面向对象的思想进行开发,包括结构体、方法、接口、组合以及错误处理等多个方面。通过学习,你将能够利用Go语言的特性写出高效、可读性强且...

    Go-基于epoll协程池的golang网络库

    在本文中,我们将深入探讨基于epoll协程池的Golang网络库的实现与应用,主要涉及Golang的网络编程和epoll事件模型。epoll是Linux系统提供的一种高效I/O事件通知机制,而协程池则是一种优化并发处理的技术。这种结合...

    Golang用武之地

    4. **面向对象支持**:尽管Golang没有传统意义上的继承机制,但它通过**structs**和**methods**提供了一种简单而强大的面向对象编程支持。这种简化的方法有助于减少代码中的冗余和提高可读性。 5. **错误处理**:...

    leetcode算法学习笔记,Python,Golang,Java.zip

    Java是一种广泛应用的面向对象语言,拥有丰富的类库和强大的跨平台能力。在LeetCode的Java解题中,会涉及到类、接口、泛型等面向对象概念,以及ArrayList、LinkedList、HashMap等数据结构的使用。此外,Java的异常...

    开源项目-golang-go.zip

    3. 基于接口的面向对象:Go语言没有类,而是使用接口来实现多态,这提供了更大的灵活性。 4. 类型系统:Go语言有严格的类型检查,有助于减少错误。 5. 标准库:Go语言的标准库非常丰富,包括网络、加密、操作系统...

    golang:gogo

    1. **学习基本语法**:包括变量、常量、函数、控制结构、面向对象编程等。 2. **理解并发编程**:熟悉goroutines和channels的用法,以及如何实现线程安全的数据共享。 3. **掌握标准库**:了解并使用常用的包,如`...

    golang-developer-roadmap:2020年成为Go开发人员的路线图

    3. **结构体与接口**:理解Go中的结构体用于组织数据,接口则提供了一种抽象的类型系统,有助于实现面向对象编程。 4. **Go的工作环境**:设置Go的开发环境,熟悉Go工具链,包括go build、go run、go test等命令。 ...

    golang_course:Golang 课程仓库

    2. **面向对象编程**:理解Go中的接口(Interface)和结构体(Struct),如何创建和使用它们来实现面向对象的设计思想,以及接口的动态绑定特性。 3. **包管理与模块系统**:了解Go的包导入机制,使用`go mod`进行...

    99-Problems:尝试解决Python,Scala和Golang中的99个Prolog问题

    这个挑战的目的是促进对逻辑编程和函数式编程的理解,同时也强化面向对象编程和过程式编程的技巧。 描述中提到的“99个问题”起源于Prolog编程领域,是一系列递增难度的编程题目,旨在帮助开发者加深对Prolog语言...

    资源专区-课程设计-编程作业-Go资源-基于GO的敬老院管理系统的设计和实现

    Go的面向对象特性,如接口和组合,可以帮助我们构建可复用和灵活的代码。 数据库集成也是关键部分,Go语言支持多种数据库驱动,如MySQL、PostgreSQL、SQLite等,可以根据需求选择合适的数据库来存储系统数据。 ...

    golang1:城市卡丁车问题

    这体现了Golang中的面向对象编程思想。 3. **错误处理**:Go语言使用`error`类型进行错误处理,通常函数会返回一个错误值,调用者需要检查并适当地处理错误。在城市卡丁车问题中,可能会遇到各种错误,如赛道超出...

    八大编程语言知识点汇总.zip

    学习Java需要掌握面向对象编程思想,了解类和对象的创建与使用,以及异常处理机制。 2. **Python** Python以其简洁明了的语法和丰富的库支持,成为数据科学、Web开发和自动化脚本的首选语言。理解Python的变量、...

    go语言设计模式

    例如,在建造者模式的案例中,通过构建不同类型的消息(命令消息、带头部的消息、多部分消息)来展示如何抽象和实现对象的构建步骤。这样的案例不仅有助于读者理解设计模式,还能教会他们如何将这些模式运用到具体的...

    Go实现贪吃蛇+Windows系统模拟控制相关练习+城市数据采集

    此外,还需要利用Go的结构体和面向对象编程思想来定义蛇、食物、边界等游戏元素。同时,游戏的逻辑处理,如蛇的移动、碰撞检测、分数计算等,都是通过函数实现的。为了实现游戏界面,Go可以借助第三方库如`github....

    漫画学习Go语言教程。

    3. **面向对象编程**:Go语言中的接口和结构体,以及如何利用它们实现面向对象的设计思想。 4. **并发编程**:Go语言的一大特色是其内置的goroutines和channels,漫画会用简单易懂的方式解释它们如何帮助开发者编写...

    go语言基础.pptx

    它的设计灵感来源于C语言,同时融合了多种现代编程思想,如面向对象、函数式编程和并发处理。Go语言以其简洁、高效和强大的并发支持而受到广泛关注,尤其适合于构建高性能服务器、分布式系统以及网络应用程序。 为...

    Go语言入门到精通课程目录1

    **匿名字段、方法、继承与重写、方法值与表达式、接口**:这部分涵盖了面向对象编程的核心概念,Go的接口实现多态,而方法和表达式展示了Go的面向对象特性。 36-38. **多态、空接口和类型断言**:多态允许不同类型...

    【Gopher China 2015】龚浩华(月牙寂)p2p缓存系统

    - **Golang的核心特性**:在Golang中,对象表现为类,具有属性(成员变量)和行为(成员函数),同时支持自主性和并发操作(通过协程实现)。此外,接口和函数变量的使用使得代码更加职能化和松散耦合,而channel则...

    Go 学习笔记 第四版

    - **面向对象编程**:Go语言的接口和结构体设计,以及如何实现面向对象编程的思想。 - **并发编程**:详细讲解goroutines和channels的使用,以及互斥锁、条件变量等同步原语。 - **内存管理**:介绍Go的内存分配策略...

Global site tag (gtag.js) - Google Analytics