爱上开源之golang入门至实战第四章-函数(func)(一)

网友投稿 292 2022-11-05


爱上开源之golang入门至实战第四章-函数(func)(一)

前言

函数是各种编程语言不可缺少的一部分,编程的过程也就是通过函数的实现和调用来完成我们需要达到的编程的目的;把函数这个章节的内容归入到了数据类型;我一直犹豫不决; 按照一般的出牌顺序,函数就处于编程的过程,不应该纳入到数据类型里来,但是我觉得纳入到这里,能够更加明显的体现出go语言里的函数所不同的地方。 下面就听我来叨咕叨咕,golang里的函数。

4.4 函数

笔者在接触Golang以前,从事过多年的java程序开发;在java里函数也即为方法,就是定义好函数名,函数返回值,实现好函数体,这样就是一个函数了,例如代码(java)

[JAVA]public void helloworld(string name){ System.out.println("Hello wolrd, " + name)}

如上这个代码,就是一段java的代码, 代码就定义了一个函数, 函数名为helloworld,传入参数为string, 返回值为void,函数体里实现了打印的功能。 在很多的编程语言里都是这样的一个方式。 go语言的函数亦然如此, 不过go的函数有其独特的地方。

语言函数定义格式如下:

func function_name( [parameter list] ) [return_types] { 函数体}

函数定义解析:

func sayHello(name string) { fmt.Println("Hello world, " + name)}fn1 := sayHelloif fn1 != nil { fn1("Golang")} else { fmt.Println("Method is nil ")}==== OUTPUT ====Hello world, Golang

可以用type关键字定义一种指定的函数类型;如下个例子,更加的高级,同样在很多的go语言的开源项目里,都可以看到类似的写法,大家学习go语言,一定要非常熟悉这样的味道

type SayHello func(name string)func sayHello01(name string) { fmt.Println("Hello world 01, " + name)}func sayHello02(name string) { fmt.Println("Hello world 02, " + name)}var sayHello SayHellosayHello = sayHello01sayHello("Golang")sayHello = sayHello02sayHello("Golang")==== OUTPUT ====Hello world 01, GolangHello world 02, Golang

在这个代码中首先定义了一个新的类型, 类型名称是SayHello, 新定义的类型是函数类型;函数类型的入参是string类型,没有返回值。

以上的代码可以变化成如下代码

type SayHello func(name string)var sayHello01 = SayHello(func(name string) { fmt.Println("Hello world 01, " + name)})var sayHello02 = SayHello(func(name string) { fmt.Println("Hello world 02, " + name)})var sayHello SayHellosayHello = sayHello01sayHello("Golang")sayHello = sayHello02sayHello("Golang")==== OUTPUT ====Hello world 01, GolangHello world 02, Golang

以上代码实际上就是将

func sayHello01(name string) { fmt.Println("Hello world 01, " + name)}

var sayHello01 = SayHello(func(name string) { fmt.Println("Hello world 01, " + name)})

这样的方式在很多的著名go语言开源项目里都是这样的写法,所以大家要见怪不怪,熟悉起来,这样的方式各人觉得在代码的精简度上要有优势了,当然这里是各个语言本身的编译器所决定的。

通过上面的例子里,可以看到我是使用的nil对函数对象进行判断, 对!!!,对应函数对象来说,都是指针,和map,slice一样。

func function_name( [parameter list] ) [return_types] { 函数体}

即return_types这里,大家要注意是可以多个的。上样例代码

type RequestHandler func(r w (int, error)

定义了一个RequestHandler的函数类型,入口参数是Request和ResponseWriter, 返回值是int和error, 可以多个值一起返回,下面我们来看个如何调用它的例子。

type RequestHandler func(r *w (int, error)func sampleHandle(r *w (int, error) { if r == nil { return -1, errors.New("request is nil") } if w == nil { return -2, errors.New("ResponseWriter is nil") } return 0, nil}r := &w handler RequestHandlerhandler = sampleHandlecode, error := handler(r, w)fmt.Printf("code=%d error-%v \n", code, error)==== OUTPUT ====code=-2 error-ResponseWriter is nil

结束语


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java中Hibernate的状态总结
下一篇:CPU上下文切换(上)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~