zoukankan      html  css  js  c++  java
  • go基础第一篇:基本语法

    2020年4月底入职Tencent CSIG,自此由Java转Go。此时Go最新版是1.14.2,我学习参考的书籍是《Go语言学习笔记》,此书基于Go1.6。

    Go是一个非常年轻的编程语言,2012年才发布第1个版本。而Java就比较古老了,1995年发布。

    go语句结束后不用分号。入口函数main没有参数,且必须放在main包中。

    使用var定义变量:

    var x int32

    var x = 100

    x := 100

    一次可以定义多个变量:

    a, b := 1, 2

    if后面的条件表达式不加括号:

    if x > 0 {
    }

    for循环也不加括号:

    for i := 0; i < 10; i++ {
    }

    for死循环:

    for {
    }

    或者

    for true {
    }

    for...range语法:

    x := []int{100, 101, 102}
    for i, n:= range x {
        println(i, "=", n)
    }

    在go中,只有for循环,没有while循环,但是可以用for来像while循环那样写,如下:

    x := 0
    for x < 5 {
        println(x)
        x++
    }

    函数可以有多个返回值:

    func div(a int, b int) (int, error) {
        if b == 0 {
            return 0, errors.New("division by zero")
        }
        return a / b, nil
    }

    返回值有多个的话,返回值类型需要用括号括住。

    函数可以有不定长入参,但要求参数类型是一样的

    func sum(p ...int) int {
        a := 0
        for _, n := range p {
            a = a + n
        }
        return a
    }

    在函数中,可以用defer定义延迟调用,效果等同于java的finally块:

    func main() {
        defer println("abc")
        str := "amy"
        var a = str[0:4]
        println(a)
    }

    上面函数中,虽然str[0:4]会报错,但是还是会打印出abc。像数组和slice的截取一样,字符串截取也用中括号和冒号。str[0:4]意思是取str的子字符串,从索引0开始取4个字符。

    panic就相当于java中的throw Exception,panic后面的语句是不可达的

    func sum() int {
        defer println("abc")
        panic("err")
        return 0
    }

    在go中,控制循环,除了常规的break、continue外,多了一个goto,配合label使用,如下

    func main() {
        for i := 1; i < 10; i++ {
            for j := 1; j < 10; j++ {
                if j > 1 {
                    goto flag
                }
                fmt.Println("i= " + strconv.Itoa(i) + ", j= " + strconv.Itoa(j))
            }
        }
    flag:
        fmt.Println("OK")
    }

    goto后面跟一个label,当执行到goto行时,直接跳到后面的label行,执行下一行代码,不管goto行嵌在多少层循环中。

    const块

    在const块中可以定义多个常量。如果常量没有用等号赋值,那么将沿用上一行的赋值等式,如下

    func main() {
        const (
            a = "A"
            b
        )
        fmt.Println(a)
        fmt.Println(b)
    }

    常量a赋值为字符串"A",常量b没有用等号赋值,那么将沿用上一行的赋值等式,即b = "A",所以b值也为字符串"A"。

    iota使用

    iota用在const块中,初始值是0,每新定义一个变量iota值就加1,直到遇见新的const,iota变为0。

    func main() {
        const (
            a int = iota
            b
        )
    
        const (
            c int = iota
            d int = iota
        )
    
        fmt.Println(a)
        fmt.Println(b)
        fmt.Println(c)
        fmt.Println(d)
    }

    常量a由iota赋值,此时iota值为0,故a值为0。给a赋值后,iota变为1,又赋值给b,故b值为1。在新的const块中,iota变为0,同理可知,c值为0,d值为1。

    数字与字符串互转:用strconv包

    strconv.Itoa(i int) string,整数转字符串。

    strconv.Atoi(s string) (int, error),字符串转整数,返回值有2个,第一个是整数,第二个是error。

    func main() {
        const (
            a = 0
            c = "1"
        )
        fmt.Println(strconv.Itoa(a))
        cI, _ := strconv.Atoi(c)
        fmt.Println(cI)
    }
  • 相关阅读:
    lambda表达式
    You can't specify target table 't_mail_marketing' for update in FROM clause
    从对象list中获取对象属性list
    枚举缓存
    Solr语法
    通过Telnet查询注册服务
    日志查询
    Maven 屏蔽静态文件
    抽奖
    随机码生成方法
  • 原文地址:https://www.cnblogs.com/koushr/p/12736884.html
Copyright © 2011-2022 走看看