func 函数名(参数列表) (返回值列表) {
执行语句...
return 返回值列表
}
在Go中,函数可以返回多个值。
在函数的传值中,值类型变量传的是自己的副本,引用类型变量传的是地址的副本。
每个源文件可以都包含一个init函数,该函数会在main函数之前执行。
所以我们可以在init函数中进行一些初始化的工作
func init() {
}
普通函数:
例1:
func add(a int, b int) int {
return a + b
}
func addSub(a int, b int) (int, int) {
return a + b, a - b
}
func addSub1(a int, b int) (add int, sub int) {
add = a + b
sub = a - b
return
}
把函数作为参数的函数
例1:
func print( func addSub(a int, b int)(int, int) ) {
fmt.Println( addSub(a, b) )
}
把函数作为返回值的函数
func gogo() func (int, int) int {
return func (a int, b int) int { return a + b }
}
gogo()(1, 2)
函数闭包
例1:
package main
import (
"fmt"
"strings"
)
func makeSuffix(suffix string) func (string) string {
return func (name string) string {
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
}
func main() {
checkSuffix := makeSuffix(".jpg")
fmt.Println(checkSuffix("tp"))
fmt.Println(checkSuffix("ho.jpg"))
}
延迟函数
在Go中函数的结束发生在函数返回之后
defer用来修饰函数(方法)调用
而被defer修饰的语句,将执行在函数返回之后,函数结束之前。
如果多条语句被defer修饰,那么按"先入后出"的方式依次执行。
func m(a *int) int {
defer fmt.Println("hello")
return a
}
内置函数
len()用来求长度
cap()用来求容量
new()用来分配内存(主要是值类型)
make()用来分配内存(主要是引用类型)
错误处理
当程序发生错误的时候,会抛出一个panic的异常,然后程序崩溃。
错误处理就是希望当程序抛出一个panic的异常时,我们能捕获它并处理,
保持程序正常运行。
例1:
package main
import "fmt"
func main() {
defer func() {
err := recover()
if err != nil {
fmt.Println("err=", err)
}
}()
num1 := 10
num2 := 0
res := num1 / num2
fmt.Println("res =", res)
}
例2:
package main
import (
"errors"
"fmt"
)
func readConf(name string) error {
if name == "config.ini" {
return nil
}else {
return errors.New("wrong")
}
}
func main() {
err := readConf("config2.ini")
if err != nil {
panic(err)
}
fmt.Println("hello")
}