标签:函数 Greeting name golang say func english 类型 string
今天看Martini文档,其功能列表提到完全兼容http.HandlerFunc
接口,就去查阅了Go: net/http的文档,看到type HandlerFunc这部分,顿时蒙圈了。由于之前学习的时候没有关注过function types的知识点,就Google了一些文章,才算是有了个大概的了解。
从golang的官方文档得知function types的解释是这样的。
A function type denotes the set of all functions with the same parameter and result types.
先找个例子来看一下:
package main import "fmt" // Greeting function types type Greeting func(name string) string func say(g Greeting, n string) { fmt.Println(g(n)) } func english(name string) string { return "Hello, " + name } func main() { say(english, "World") } 输出Hello, World
say()函数要求传入一个Greeting类型,因为english函数的参数和返回值跟Greeting一样,参考接口的概念这里可以做类型转换。我们换个方式来实现上面的功能:
package main import "fmt" // Greeting function types type Greeting func(name string) string func (g Greeting) say(n string) { fmt.Println(g(n)) } func english(name string) string { return "Hello, " + name } func main() { g := Greeting(english) g.say("World") }
同样输出Hello, World
,只是给Greeting类型添加了say()
方法。上面说了,函数类型是表示所有包含相同参数和返回类型的函数集合。我们在一开始先把func(name string) string
这样的函数声明成Greeting
类型,接着我们通过Greeting(english)
将english
函数转换成Greeting
类型。通过这个转换以后,我们就可以借由变量g调用Greeting
类型的say()
方法。两段代码的差异就是go的类型系统添加方法和类C++语言添加类型方法的差异,具体讲解可以去查看《Go语言编程》第3章为类型添加方法这一节。
既然是函数集合,那么只有一个函数显然是不足以说明问题的。
package main import "fmt" // Greeting function types type Greeting func(name string) string func (g Greeting) say(n string) { fmt.Println(g(n)) } func english(name string) string { return "Hello, " + name } func french(name string) string { return "Bonjour, " + name } func main() { g := Greeting(english) g.say("World") g = Greeting(french) g.say("World") } 输出 Hello, World Bonjour, World
在其他语言里面,有些函数可以直接作为参数传递,有些是以函数指针进行传递,但是都没有办法像go这样可以给函数类型“增加”新方法。
回到Go: net/http的HandlerFunc类型,只要Martini的函数遵循文档中type HandlerFunc func(ResponseWriter, *Request)
的要求,就可以转换成HandlerFunc类型,也就可以调用func (HandlerFunc)ServeHTTP
函数。
标签:函数,Greeting,name,golang,say,func,english,类型,string 来源: https://www.cnblogs.com/igoodful/p/11519695.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。