Go:func 函数

Go:func 函数

func 函数

func函数(适用于method)小结

Go函数

数也是一种类型,可以和其他类型一样被保存在变量中。和接口一样,接口也是一种类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
package main
import (
"fmt"
)
func foo() {
fmt.Println("foo")
}
func main() {
var f func()
f = foo
f()
}

Go函数类型实现接口——把函数作为接口来调用

函数体实现接口
函数的声明不能直接实现接口,需要将函数定义为类型后,使用类型实现结构体。当类型方法被调用时,还需要调用函数本体。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 函数定义为类型
type FuncCaller func(interface{}) // func(interface{}) 定义为 FuncCaller 类型。
// 实现Invoker的Call
func (f FuncCaller) Call(p interface{}) {
// 调用f()函数本体
f(p)
//FuncCaller 的 Call() 方法将实现 Invoker 的 Call() 方法。
// FuncCaller 的 Call() 方法被调用与 func(interface{}) 无关,还需要手动调用函数本体。
}

//代码备注:
//以上函数类型,需要函数本身进行逻辑处理。FuncCaller 无须被实例化,只需要将函数转
//换为 FuncCaller 类型即可,函数来源可以是命名函数、匿名函数或闭包。

HTTP实现场景:

函数 handler() 转为 HandlerFunc 类型,HandlerFunc 类型实现了 Handler 的 ServeHTTP 方法,
底层可以同时使用各种类型来实现 Handler 接口进行处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HTTP 包中包含有 Handler 接口定义,代码如下:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
Handler 用于定义每个 HTTP 的请求和响应的处理过程。

同时,也可以使用处理函数实现接口,定义如下:
type HandlerFunc func(ResponseWriter, *Request)
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
要使用闭包实现默认的 HTTP 请求处理,可以使用 http.HandleFunc() 函数,函数定义如下:
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}
而 DefaultServeMux 是 ServeMux 结构,拥有 HandleFunc() 方法,定义如下:
func (mux *ServeMux) HandleFunc(pattern string, handler func
(ResponseWriter, *Request)) {
mux.Handle(pattern, HandlerFunc(handler))
}
上面代码将外部传入的函数 handler() 转为 HandlerFunc 类型,HandlerFunc 类型实现了 Handler 的 ServeHTTP 方法,
底层可以同时使用各种类型来实现 Handler 接口进行处理。

Go可变参数函数调用注意事项(three dots)
  • 若将 string 数组切片,每项独自传入函数,则会执行[]T{arg1,arg2}等类似操作,从新进行初始化;
  • 若将 interface{} 数组切片打散后直接传入函数,则不再进行对象的创建,直接试用该对象;

Go … three dots 用法:

变长的函数参数(逐一传参用法)

调用参数最后一个…T,在参数列表的最后使用若干个类型为T的参数。
…T在函数内部的类型实际是[]T.

调用拥有变长参数列表的函数

slice类型参数不必拆分调用,直接在slice后跟…

标识数组元素个数

例如[…]int{1,2,3}

Go命令行中的通配符

描述包文件的通配符。会执行当前目录和所有子目录的所有包:

1
2
3
4
5

go test ./...
go run ./...
go build ./..

Author

Jack Liu

Posted on

2020-02-27

Updated on

2024-02-17

Licensed under