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

通学技术 通学技术     2022-12-09     293

关键词:

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

在第一篇文章中,我们学习了go的基本词法及语法,而这些东西都是静态的,作为一个拥有面向对象思想的我们,有静当然要有动,有属性当然也要有行为,那么什么能保证我们的行为呢?相信聪明的你已经知道了,那就是函数。

6、函数

go语言本着简单简洁的原则,函数的写法也是十分的简单。直接看下面的例子就知道了。

package main

import "fmt"

//函数 举例 数字互换

func main()
	a,b := 1,2

	swap1(a,b)
	fmt.Println(a,b)

	swap2(&a,&b)
	fmt.Println(a,b)

	swap3(a,b)
	fmt.Println(a,b)


// swap内部对参数进行的修改 并不会影响到swap调用时传入的a和b本身。
func swap1(a,b int)  
	temp := a
	a = b
	b = temp


// 指针交换
func swap2(a,b *int)
	temp := *a
	*a = *b
	*b = temp


// 返回多个返回值
func swap3(a,b int) (int,int)
	return b,a


上面我们通过一个交换的简单算法说明了go语言的函数,有了函数之后,我们也会在特定场景下不需要函数名,说白了就是懒。懒才是进步的原动力啊。

7、匿名函数

package main

import "fmt"

// 匿名函数

//c := func(a, b int) int 
//	return a + b
//(10, 20)

func main()

	a := add_sub(10,20,add)
	fmt.Println(a)

	b := add_sub(10,20,sub)
	fmt.Println(b)





func add(a,b int) int
	return a+b


func sub(a,b int) int
	return a-b


// 将函数作为函数的参数-- 函数式编程的思想
func add_sub(a,b int, f func(a,b int) int) int
	return f(a,b)

上面也是举了一个例子,来体现go语言函数式编程的思想,毕竟也是进一步减少了我们书写代码的数量,将函数做为参数去传递,有时候也确实方便。

8、闭包

package main

import "fmt"

//闭包--在自函数内部中 可以读取 父函数的变量
func main()
	// nexNumer()和f()中i的内存地址是相互独立 ,所以最终 返回不受影响
	nextNumber := getSequence()
	fmt.Println(nextNumber())
	fmt.Println(nextNumber())
	fmt.Println(nextNumber())

	f := getSequence()
	fmt.Println(f())
	fmt.Println(f())
	fmt.Println(nextNumber())



// 返回的是一个函数 而返回函数的返回是一个int类型的值 实现了自增序列
func getSequence() func() int

	i := 0
	return func() int
		i += 1
		return i
	

以上的例子通过闭包的方式,实现了一个自增序列生成器,至于你想要问,为什么不直接返回一个int类型的值呢?欢迎大家参与讨论。

总体来说,go语言的函数和其他语言并无太大差别。这里机灵的小伙伴可能已经发现了,怎么go语言没有像java那样有修饰函数是公有还是私有那样的关键字public private这些呢?

这里不得不佩服go的设计大佬们,他们想到了用大小写来控制go函数是否是公有还是私有的,这可真是简洁他妈给简洁开门,简洁到家了~

package visibility
import "fmt"
const PI = 3.145
const pi = 3.14
const _PI = 3.14
var P int = 1   
var p int = 1
func private_function()  
	fmt.Println("only used in this package!")


func Public_fuction() 
	fmt.Println("used in anywhere!")  



package main

import (
	"visibility"
	"fmt"
)

func main() 
	visibility.Public_fuction() //used in anywhere!
	//visibility.private_function() //不能访问私有函数,无法通过编译
	fmt.Println(visibility.P) //1
	//fmt.Println(visibility.p) //不能访问私有变量,无法通过编译
	fmt.Println(visibility.PI) //3.14
	//fmt.Println(visibility.pi) //不能访问私有常量,无法通过编译
	//fmt.Println(visibility._PI) //不能访问私有常量,无法通过编译 

好啦,关于go函数我们就介绍到这里了,下期我们将继续复习go语言的容器。

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

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

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

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

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

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

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

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

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

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

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

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

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

区块链技术go语言——变量篇(代码片段)

/**@Author:mrtao*@Date:2018-08-1110:56:38*@LastModifiedby:mrtao*@LastModifiedtime:2018-08-1211:04:04*/packagemainimport"fmt"funcmain() varaint a=20 fmt.Println("a=& 查看详情

区块链技术go语言——数组篇(代码片段)

/**@Author:mrtao*@Date:2018-08-1414:48:25*@LastModifiedby:mrtao*@LastModifiedtime:2018-08-1415:55:51*/packagemainimport"fmt"funcmain() //指针 varp*int a:=10 p=&a //p& 查看详情

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

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

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

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

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

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

区块链钱包之创建钱包地址(代码片段)

(一)区块链钱包之生成助记词(二)区块链钱包之创建钱包地址(三)区块链钱包之加密算法简介(四)区块链钱包之创建比特离线交易(BTC交易)(五)区块链钱包之创建以太坊... 查看详情

创建自己的区块链网络十二(代码片段)

...说,直接开始。系列文章直通车名称链接创建自己的区块链网络一点击此处创建自己的区块链网络二点击此处创建自己的区块链网络三点击此处创建自己的区块链网络四点击此处创建自己的区块链网络五点击此处创建自己的... 查看详情

区块链钱包之加密算法简介(代码片段)

(一)区块链钱包之生成助记词(二)区块链钱包之创建钱包地址(三)区块链钱包之加密算法简介(四)区块链钱包之创建比特离线交易(BTC交易)(五)区块链钱包之创建以太坊... 查看详情

区块链基础语言——go语言结构(代码片段)

一、第一个Go程序我们第一个Go程序以最简单的Helloworld作为开始。所有Go语言程序文件的文件名都以“.go”结尾,该程序可以命名为:helloWorld.go。二、程序结构分析Go语言程序一般由关键字、包、常量、变量、运算符、符号... 查看详情

区块链教程fabric1.0源代码分析peerpeer根命令入口及加载子命令二(代码片段)

区块链教程Fabric1.0源代码分析Peerpeer根命令入口及加载子命令二。flogging,即:fabriclogging,为Fabric基于第三方包go-logging封装的日志包,go-logging使用方法参考:github.com/op/go-logging如下代码为flogging包的初始化函数:funcinit()????logger=... 查看详情

区块链钱包之生成助记词(代码片段)

(一)区块链钱包之生成助记词(二)区块链钱包之创建钱包地址(三)区块链钱包之加密算法简介(四)区块链钱包之创建比特离线交易(BTC交易)(五)区块链钱包之创建以太坊... 查看详情

区块链报错4|区块链玄学|truffleunbox下载downloading步骤失败(代码片段)

系列文章(持续更新)·欢迎交流:区块链DApp从零开始学(一)|DApp抓包区块链DApp从零开始学(二)|超详细DApp创建|发行代币token|宠物领养区块链DApp从零开始学(三)|获得Contract合约实例想初始化宠物商店的demo:truffleunbo... 查看详情