- 函数
- 返回值带有变量名
return时可以不写返回值,在返回值位置声明即可
func namedRetvalue() (a, b int) { a = 1 b = 2 return }
- 匿名函数
- 定义时调用
func(data int) { fmt.Println(data) }(100)
- 匿名函数被赋值与调用
f := func(data int) { fmt.Println(data) } f(100)
- 匿名函数作为回调函数
func visit(list []int, f func(int)) { for -, v := raneg list{ f(v) } } visit([]int{1,2,3,4}, func(v int){ fmt.Println(v) })
- 定义时调用
- 可变参数
func myfunc(args ...int) { for -, arg := range args { fmt.Println(arg) } }
任意类型的可变参数
func myfunc(args ...interface{}) { var typeString string // 类型断言 for _, s := range args { switch s.(type) { case bool: typeString = "bool" case string: typeString = "string" case int: typeString = "int" } } fmt.Println(typeString) } func main() { myfunc(1, "a", true) }
- defer延迟语句
后进先出
函数退出时,释放资源func main() { defer fmt.Println(1) defer fmt.Println(2) defer fmt.Println(3) }
var ( cMap = make(map[string]int) cMutex sync.Mutex ) func myfunc(key string) int { cMutex.Lock() defer cMutex.Unlock() return cMap[key] } func main() { ret := myfunc("A") fmt.Println(ret) }
- Go运行时错误
1.一个可能造成错误的函数,需要返回一个错误接口 error 2.函数调用后需要检查错误,正确处理每一个可能发生的错误的函数 3.实现Error() string 方法的接口 4.errors包自定义错误,errors.New("error")
- panic与recover
panic会引发程序崩溃,一般用于严重的错误
recover只在延迟函数defer中有效,调用recover捕获panic的输入值func RecoverPanic(entry func()) { defer func() { err := recover() switch err.(type) { case runtime.Error: fmt.Println(err) default: fmt.Println(err) } }() entry() }
- 哈希函数
- md5/sha-1
import ( "crypto/md5" "crypto/sha1" ) func main() { cString := "Hello, 世界" md5Ins := md5.New() md5Ins.Write([]byte(cString)) result := md5Ins.Sum([]byte("")) println(result) sha1Ins := sha1.New() sha1Ins.Write([]byte(cString)) result = sha1Ins.Sum([]byte("")) println(result) }
- md5/sha-1
- 返回值带有变量名
记录自己的学习历程!