GoLang之各种函数的用法

来源:互联网 发布:协鑫光伏 阿里云 编辑:程序博客网 时间:2024/06/14 07:46

2013-12-27 wcdj

大纲

本文总结GoLang中常用的几种函数用法,主要包括:

[0] 首先main是一个没有返回值的函数
[1] 普通函数
[2] 函数返回多个值
[3] 不定参函数
[4] 闭包函数
[5] 递归函数
[6] 类型方法, 类似C++中类的成员函数
[7] 接口和多态
[9] 错误处理, Defer接口
[10] 错误处理, Panic/Recover


测试代码

package mainimport ("fmt""math""errors""os""io")///////////////////////////////////////func max(a int, b int) int {if a > b {return a}return b}func multi_ret(key string) (int, bool) {m := map[string]int{"one":1, "two":2, "three":3}var err boolvar val intval, err = m[key]return val, err}func sum(nums ...int) {fmt.Print(nums, " ")total := 0for _, num := range nums {total += num}fmt.Println(total)}func nextNum() func() int {i, j := 0, 1return func() int {var tmp = i + ji, j = j, tmpreturn tmp}}func fact(n int) int {if n == 0 {return 1}return n * fact(n-1)}// 长方形type rect struct {width, height float64 }func (r *rect) area() float64 {return r.width * r.height}func (r *rect) perimeter() float64 {return 2 * (r.width + r.height)}// 圆形type circle struct {radius float64}func (c *circle) area() float64 {return math.Pi * c.radius * c.radius}func (c *circle) perimeter() float64 {return 2 * math.Pi * c.radius}// 接口type shape interface {area() float64perimeter() float64}func interface_test() {r := rect{width: 2, height: 4}c := circle{radius: 4.3}// 通过指针实现s := []shape{&r, &c}for _, sh := range s {fmt.Println(sh)fmt.Println(sh.area())fmt.Println(sh.perimeter())}}type myError struct {arg interrMsg string}// 实现error的Error()接口func (e *myError) Error() string {return fmt.Sprintf("%d - %s", e.arg, e.errMsg)}func error_test(arg int) (int, error) {if arg < 0 {return -1, errors.New("Bad Arguments, negtive")} else if arg > 256 {return -1, &myError{arg, "Bad Arguments, too large"}}return arg * arg, nil}func CopyFile(dstName, srcName string) (written int64, err error) {src, err := os.Open(srcName)if err != nil {fmt.Println("Open failed")return}defer src.Close()dst, err := os.Create(dstName)if err != nil {fmt.Println("Create failed")return}defer dst.Close()// 注意dst在前面return io.Copy(dst, src)}//////////////////////func main() {// [0] 首先main是一个没有返回值的函数// [1] 普通函数fmt.Println(max(1, 100))// [2] 函数返回多个值v, e := multi_ret("one")fmt.Println(v, e)v, e = multi_ret("four")fmt.Println(v, e)// 典型的判断方法if v, e = multi_ret("five"); e {fmt.Println("OK")} else {fmt.Println("Error")}// [3] 不定参函数sum(1, 2)sum(2, 4, 5)nums := []int{1, 2, 3, 4, 5}sum(nums...)// [4] 闭包函数nextNumFunc := nextNum()for i := 0; i < 10; i++ {fmt.Println(nextNumFunc())}// [5] 递归函数fmt.Println(fact(4))// [6] 类型方法, 类似C++中类的成员函数r := rect{width: 10, height: 15}fmt.Println("area: ", r.area())fmt.Println("perimeter: ", r.perimeter())rp := &rfmt.Println("area: ", rp.area())fmt.Println("perimeter: ", rp.perimeter())// [7] 接口和多态interface_test()// [8] 错误处理, Error接口for _, val := range []int{-1, 4, 1000} {if r, e := error_test(val); e != nil {fmt.Printf("failed: %d:%s\n", r, e)} else {fmt.Println("success: ", r, e)}}// [9] 错误处理, Defer接口if w, err := CopyFile("/data/home/gerryyang/dst_data.tmp", "/data/home/gerryyang/src_data.tmp"); err != nil {fmt.Println("CopyFile failed: ", e)} else {fmt.Println("CopyFile success: ", w)}// 你猜下面会打印什么内容fmt.Println("beg ------------")for i := 0; i < 5; i++ {defer fmt.Printf("%d ", i)}fmt.Println("end ------------")// [10] 错误处理, Panic/Recover// 可参考相关资料, 此处省略}/*output:1001 true0 falseError[1 2] 3[2 4 5] 11[1 2 3 4 5] 1512358132134558924area:  150perimeter:  50area:  150perimeter:  50&{2 4}812&{4.3}58.08804816487527527.01769682087222failed: -1:Bad Arguments, negtivesuccess:  16 <nil>failed: -1:1000 - Bad Arguments, too largeCopyFile success:  8------------------------4 3 2 1 0*/

参考

发现耗子叔叔两篇不错的GoLang入门文章,真是坐车和上厕所必备精品。

[1] Go 语言简介(上)— 语法

[2] Go 语言简介(下)— 特性




0 0