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)
}
原文地址:https://www.cnblogs.com/koushr/p/12736884.html