首页 > 其他分享 >golang面向对象思想和实现

golang面向对象思想和实现

时间:2023-01-05 17:36:11浏览次数:34  
标签:poem string 思想 Author Poem golang 面向对象 Heine


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面向对象示例代码


<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>


标签:poem,string,思想,Author,Poem,golang,面向对象,Heine
From: https://blog.51cto.com/kenkao/5991626

相关文章

  • golang web开发获取get、post、cookie参数
    在成熟的语言java、python、php要获取这些参数应该来讲都非常简单,过较新的语言golang用获取这些个参数还是费了不少劲,特此记录一下。golang版本:1.3.1在贴代码之前如果能......
  • 面向对象OOP
    面向对象OOP面向对象什么是面向对象: 是一种编程思想,核心是对象,程序就是一系列对象的集合,程序员负责调度控制这些对象来交互着完成任务: 案例:西天取经 如......
  • 在线客服系统的源码中Golang Gin框架实现IP白名单机制
    我的客服系统有一些接口是专门给内部调用的,只允许其他内部系统来调用,不允许随意访问,可以使用IP白名单机制使用Gin框架实现IP白名单机制可以使用中间件的方式实现。你......
  • Go语言(golang)开源项目大全
    ​​http://www.open-open.com/lib/view/open1396063913278.html#Compression​​内容目录​​Astronomy​​​​构建工具​​​​缓存​​​​云计算​​​​命令行选项解......
  • 在线客服系统源码编译Golang语言下go build命令构建二进制程序
     gobuild 命令好处我开发了一套在线客服系统源码,使用了gobuild进行编译在我的在线客服系统使用gobuild命令的主要好处是,它可以将Go程序编译成可执行文件,这样就......
  • go-dongle 0.2.5 版本发布,一个轻量级、语义化的 golang 编码解码、加密解密库
    dongle是一个轻量级、语义化、对开发者友好的Golang编码解码和加密解密库Dongle已被awesome-go收录,如果您觉得不错,请给个star吧github.com/golang-module/dong......
  • golang linux/windows下根据日期自动备份,恢复mysql数据表
    由于shell不熟,所以用golang进行自动化备份mysql备份某个数据库下指定日期的表。比如’tb_20221210'这样的表名1packagemain23import(4"fmt"5......
  • golang 断言
    开心一刻    小学时,因为淘气,再加上成绩不好,爸妈经常打我,有次爷爷奶奶来家里,看到我挨打,心疼啊,就把我接过去住!没一个月,我就被送回父母家了,爷爷奶奶进门第一句话就是:......
  • golang的mutex互斥锁
    什么是计算机的锁?以前经常遇到锁的时候,计算机的锁到底是一个普通变量,还是一个数据总线的一个开关。网上查,一上来都是一大推的云里雾里专业术语。看了也不懂,怪本人计算机知识......
  • 顺序表的基本操作与重要思想
    本文的主要内容是高度总结顺序表的两种具体模型(线性顺序表、链式顺序表)的基本操作和一般操作套路。什么是基本操作?根据这篇文章(数据结构(DataStructure)的基本思想是增删......