zoukankan      html  css  js  c++  java
  • golang使用注意事项

    1.可以给类型取别名,但是该类型和别名是两个不同的类型:

      type myInt int

    2.go支持可变参数:args...

      0个或多个参数:func sum(args... int) sum int {}

      1个或多个参数:func sum(n int, args... int) sum int {}

    3.init()函数是初始化函数,如果有全局变量,执行顺序为:全局变量——> init()——>main()

    4.匿名函数:

        res := func(n1 int, n2 int) int {
            return n1 + n2
        }(10, 20)
        fmt.Println(res)
        a := func(n1 int, n2 int) int {
            return n1 - n2
        }
        fmt.Println(a(10, 5))

    5.全局匿名函数:

    var(
         Fun1 = func(n1 int, n2 int) int {
            return n1 * n2
        }
     )
    
    func main() {
        b := Fun1(10, 5)
        fmt.Println(b)
    }

     6.闭包:返回的是一个匿名函数,但是这个匿名函数引用到函数外的n,因此这个匿名函数就和n形成一个整体,构成闭包。

    func makeSuffix(suffix string) func (string) string {
        return func (name string) string {
            if !strings.HasSuffix(name, suffix) {
                return name + suffix
            }
        return name
        }
    }

    7.defer:当执行到defer时,暂时不执行,会将defer后面的语句压入到独立的栈(defer栈),当函数执行完毕后,再从defer栈,按照先入后出的方式出栈:

    func sum1(n1 int, n2 int) int {
        defer fmt.Println("ok1 n1-", n1)
        defer fmt.Println("ok2 n2-", n2)
    
        res := n1 + n2
        fmt.Println("ok3 res-", res)
        return res
    }

    8.字符串遍历,同时处理有中文的问题 r := []rune(str)

    str := "hello北京"
        r := []rune(str)
        for i := 1; i < len(r); i++ {
            fmt.Printf("字符=%c
    ", r[i])
        }

     9.使用defer+recover来处理错误

    func test(){
        defer func() {
            err := recover()
            if err != nil {
                fmt.Println("err=", err)
            }
        }()
        num1 := 10
        num2 := 0
        res := num1 / num2
        fmt.Println("res=", res)
    }
    
    func main() {
        test()
    }

    10.自定义错误:errors.New和panic内置函数

      1)errors.New("错误说明"), 会返回一个error类型的值,表示一个错误

      2)panic内置函数,接收一个interface{}类型的值(也就是 任何值了)作为参数,可以接收error类型的变量,输出错误信息,并退出程序

    func readConf(name string) (err error) {
        if name == "config.ini" {
            return nil
        } else {
            return errors.New("读取文件错误...")
        }
    }
    
    func test() {
        err := readConf("config.ini")
        if err != nil {
            panic(err)
        }
        fmt.Println("test()继续执行...")
    }
    
    func main() {
        test()
    }
    人生就是要不断折腾
  • 相关阅读:
    Log4net的一点改进
    SONY的几款秋季新品都还是很不错的
    在VisualStudio 工具箱中隐藏用户控件
    WPF中的DesignMode判断
    SONY的一款Win8平板
    .Net中的不可变集合(Immutable Collection)简介
    C++ 11中几个我比较喜欢的语法(三)
    很好用的谷歌字体以及Gravatar头像一键替换WordPress插件----WP Acceleration for China 插件
    关于微信获取access_token接口,返回值为-1000的问题
    主合同与补充合同的区别有哪些?
  • 原文地址:https://www.cnblogs.com/xiangxiaolin/p/11768902.html
Copyright © 2011-2022 走看看