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

Posted 通学技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通学区块链系列-从go开始之函数篇(二)相关的知识,希望对你有一定的参考价值。

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

在第一篇文章中,我们学习了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开始之面向对象

通学区块链系列-从go开始之面向对象

通学go语言系列之函数(二)