通学区块链系列-从go开始之面向对象(代码片段)

通学技术 通学技术     2022-12-05     531

关键词:

通学技术,面向区块链编程

我们都知道,这个世界都是有一个个对象构成的,作为要描绘现实世界的编程语言来说,怎么来表征一个对象,显得尤为重要。我们都知道java是通过类的方式来表征对象的,那么go是不是也通过类呢?

答案是否定的。在这里,go继承了c语言的思想,通过结构体来描述对象,做到了原始的纯粹,但同时又加入了继承、封装、多态的思想,使得面向对象得以完善。

oop1、自定义结构体

package main

import "fmt"

/*
	oop--面向对象 自定义结构
	现代编程,都讲究面向对象编程 作为一门比较潮的go语言来说
	面向对象自然也是支持的 而面向对象的三要素分别是
	封装、继承、多态
	然我们来看看go是怎么玩转他们的吧
 */

// 首先我们的go 忽略了class的概念 转而用结构体来声明对象
/*
	说明: Go语言作为一门基于包管理的开发语言
如果想将自己的结构体作为公共包被其他包导入,需
要将结构体的首字母大写,同样地,结构体内部的字
段和函数希望被外部包访问也需要将首字母大写。
*/
type Person struct 
	name string
	age int
	sex string
	// 战斗力
	fight int


func main()
	// 定义并初始化
	p1 := Person"渣渣辉",30,"man",5
	fmt.Println(p1)

	// 先定义后赋值
	var p2  Person
	p2.age = 10
	p2.name = "胖渣渣"
	p2.sex = "woman"
	// +v的打印方式 可以更详细地显示结构体内容
	fmt.Printf("%+v\\n",p2)


oop2、封装

package main

import (
	"fmt"
	"math"
)

// 当整个世界都说你不行的时候 你必须要大声地对他们说 我行
/*
	封装:
		1.在结构体外部定义
		2.方法一定要体现出调用者,方法只能被调用者类型的对象调用

	格式:
		func (obj objT) funcName([params list] [return list])

 */
func main() 
	p1 := Point0.0, 0.0
	p2 := Point3.0,4.0
	fmt.Println(getDis(p1,p2))
	fmt.Println(p2.getDis2(p1))


type Point struct 
	x, y float64


func getDis(p1, p2 Point) float64 
	return math.Sqrt((p2.x-p1.x)*(p2.x-p1.x) + (p2.y-p1.y)*(p2.y-p1.y))


// 只能被Point类型的对象调用
func (this Point) getDis2(p Point) float64 
	return math.Sqrt((this.x-p.x)*(this.x-p.x) + (this.y-p.y)*(this.y-p.y))


oop3、组合

package main

import "fmt"

/**
	结构体内嵌
	说明:
		我们都知道 在面向对象的世界里,有两种主要模式
		一种是我们所说的继承 而另外一种就是我们就是我们的组合
		例如,儿子会继承爸爸的财产,他们都同事继承人的普遍特性吃喝拉撒
		而人都是有手脑眼口鼻等这些对象组合而成的
 */

// 组合或类型表征
func main()
	p1 := Person1"渣渣辉",30,"man",5
	s1 := Superman
		strength: 100000,
		speed: 19000,
		p:p1,//逗号必须有
	
	s1.p.setAge(40)
	s1.print()


// 同包下 结构体名称不能相同
type Person1 struct
	name string
	age int
	sex string
	fright int


// 引用类型
func (p *Person1) setAge(age int)
	p.age = age

// 超人也具有人的特性
type Superman struct
	strength int
	speed int
	p Person1


func (s Superman) print()
	fmt.Printf("%+v\\n",s)


oop4、内嵌–继承

package main

import "fmt"

/**
	结构体内嵌(embed)
	--go中没有类似于java的extends、solidity的is这类直接表征继承的关键字
    而是采用了更为直接的方式 内嵌
 */

func main()

	p1 := Person2"渣渣辉",30,"man",5
	s1 :=Superman1
		strength: 100000,
		speed: 9000,
		// 正确的写法
		Person2 : p1,
	
	// 子类直接调用父类的方法 继承财产、能力、品性更直接更方便啦
	s1.setAge(50)
	s1.print()



type Person2 struct 
	name string
	age int
	sex string
	fight int


type Superman1 struct 
	strength int
	speed    int
	// 结构体内嵌的写法
	Person2


func (p *Person2) setAge(age int)
	p.age = age


func (s *Superman1) print()
	fmt.Printf("%+v\\n",s)









oop5、接口(多态)

package main

import "fmt"

/*
	接口
	--在go语言中,多态可以直接用接口实现
	所谓多态 就是父类的对象可以调用自己不同子类的方法
    注意点:
		结构体要支持接口,必须将接口内的方法全部实现
	说明:
		站在接口的层面,任何一个结构体实现了该接口规
	定的所有方法,就代表改结构体支持了该接口,反过来如
	果一个结构体封装了接口要求的所有方法,该接口的对象
	(接口对象为指针类型)可以指向该结构体的对象,此时
    可以认为该接口对象就是该结构体对象的指针,此时去调
	用接口内的某方法也就是调用该结构体实现的那种同名方
	法。
*/

func main() 
	c1 := Cat"white"
	d1 := Dog"Black"

	// 定义接口
	var a1 Animal
	// 接口指向Cat对象
	a1 = &c1
	// 通过接口调用Eat
	a1.Eat()

	// 接口指向Dog对象
	a1 = &d1
	// 通过接口调用Sleep
	a1.Sleep()



type Animal interface 
	Sleep()
	Eat()


type Cat struct 
	color string


func (c Cat) Sleep() 
	fmt.Printf("%s cat is sleeping\\n", c.color)


func (c Cat) Eat() 
	fmt.Printf("%s cat is eating\\n", c.color)


type Dog struct 
	color string


func (d *Dog) Sleep() 
	fmt.Printf("%s dog is sleeping\\n", d.color)


func (d *Dog) Eat() 
	fmt.Printf("%s dog is eating\\n", d.color)


上面的案例,大家可以自己跟着敲一敲,加深理解。

学通技术,构建可信任社会

通学区块链系列-从go开始之面向对象(代码片段)

通学技术,面向区块链编程我们都知道,这个世界都是有一个个对象构成的,作为要描绘现实世界的编程语言来说,怎么来表征一个对象,显得尤为重要。我们都知道java是通过类的方式来表征对象的,那... 查看详情

通学区块链系列-从go开始容器篇(代码片段)

通学技术,面向区块链编程在上篇文章中,我们介绍了go语言的基本语法。这节我们重点来看看go之容器数据结构的用法。学过java的小伙伴应该都只要有一节很重要的知识,那就是集合。而go与之对应的就是容器,不过... 查看详情

通学区块链系列-从go开始之数据类型与定义(代码片段)

通学技术,学通技术,面向区块链编程,构建可信社会。写在前面通学智能合约系列第二卷,从go开始。距离我上次写智能合约方面的文章,已经过去了3个月了,这期间,我探索了很多赚钱的副业,... 查看详情

通学区块链系列-从go开始容器篇(代码片段)

通学技术,面向区块链编程在上篇文章中,我们介绍了go语言的基本语法。这节我们重点来看看go之容器数据结构的用法。学过java的小伙伴应该都只要有一节很重要的知识,那就是集合。而go与之对应的就是容器,不过... 查看详情

通学区块链系列-从go开始之函数篇(二)(代码片段)

通学技术,面向区块链编程在第一篇文章中,我们学习了go的基本词法及语法,而这些东西都是静态的,作为一个拥有面向对象思想的我们,有静当然要有动,有属性当然也要有行为,那么什么能保证我们的... 查看详情

用go构建一个区块链--part6:交易(代码片段)

引言在这个系列文章的一开始,我们就提到了,区块链是一个分布式数据库。不过在之前的文章中,我们选择性地跳过了“分布式”这个部分,而是将注意力都放到了“数据库”部分。到目前为止,我们几乎已经实现了一个区块... 查看详情

通学智能合约系列(十九)--memory与storage(代码片段)

Solidity-内存、引用与持久化存储1、内存与区块链——storage与memory原理在前面的学习当中,我们知道了,合约中的一个被public修饰的成员变量,会默认生成一个供外部调用的函数,而这个函数是存储在区块链自身... 查看详情

通学智能合约系列(十六)--合约的继承(代码片段)

大家好,这里是通学技术,欢迎大家继续跟我一起学习智能合约系列。13、面向对象–合约的继承相信能看到这里的人,想必都是有经验的开发人员了,坚持不懈,耐得住寂寞。solidity作为一种图灵完备的面向... 查看详情

区块链开发之solidity编程基础合约继承抽象合约接口(代码片段)

继承原理单继承多重继承同名修饰器或函数、事件菱形继承问题多重继承的函数调用抽象合约接口本文主要讲解下Solidity的继承系统,主要内容为单继承以及多重继承。如果有其他编程经验的话,便知道继承的主要目的在... 查看详情

通学智能合约系列(十七)--函数与getter(代码片段)

大家好,这里是通学技术,承接上节,我们一起继续来学习智能合约系列。16、函数小结前面我们花费了巨多的篇幅来介绍函数,可见函数是多么的重要。不过当然也是,在面向对象的思想里,属性和行为... 查看详情

第十篇:面向对象系列之三大特性(代码片段)

...意义上的封装:  封装:从封装本身的理解,装--将一系列东西(苹果、梨子、香蕉等)一股脑的塞进一个盒子内,而封--自然就是密封,即用胶带啥的为其封口;同样编程中的封装也可以这样理解:上述的盒子我们可以理解... 查看详情

go语言系列之数组和切片(代码片段)

《Go语言系列文章》Go语言系列(一)之Go的安装和使用Go语言系列(二)之基础语法总结1.数组数组用于存储若干个相同类型的变量的集合。数组中每个变量称为数组的元素,每个元素都有一个数字编号——数组下标,该下标从0开始,... 查看详情

mimblewimble系列之协议介绍(代码片段)

MimbleWimble是什么?MimbleWimble是一个区块链格式和协议,依托于健壮的加密原语,提供非常好的可扩展性、隐私和可替代性。它解决了当前几乎所有实现的区块链(与现实需求之间)差距。Grin和Beam都是实现Mimble... 查看详情

11.区块链系列之nft从零到一开发(代码片段)

本文讲解如何从零到一打造自己的NFT所有代码已上传至https://gitee.com/SJshenjian/blockchain/tree/master/hardhat-nft-fcc1.下载安装项目gitclonehttps://gitee.com/SJshenjian/blockchain.gitcdhardhat-nft-fccyarn2.配置修改新增订阅在https://vrf.chain.link/中新增订阅&#... 查看详情

从零开发区块链应用--结构体初识(代码片段)

文章目录一、结构体定义二、初始化结构体三、结构体的访问四、结构体指针五、结构体可见性六、结构体标签七、结构体嵌套八、结构体方法九、结构体特性Go语言中提供了对struct的支持,struct,中文翻译称为结构体,与数组... 查看详情

区块链之开发命令行操作模块(代码片段)

...介绍go语言中flag用法简介项目命令行具体实现链接:区块链项目github地址项目目前进度:功能介绍利用命令行操作区块链相较于图形用户界面来说,编写代码简单,同时也可以实现复杂的功能。命令行模块的功能... 查看详情

cpp区块链模拟示例序列化(代码片段)

有了区块和区块链的基本结构,有了工作量证明,我们已经可以开始挖矿了。剩下就是最核心的功能-交易,但是在开始实现交易这一重大功能之前,我们还要预先做一些铺垫,比如数据的序列化和启动命令解析。根据《用Go构建... 查看详情

只用200行go代码写一个自己的区块链!(代码片段)

区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的。这篇文章就是帮助你使用Go语言来实现一个简单的区块链,用不到200行代码来揭示区块链的原理!高可用... 查看详情