Go 避坑指南(持续更新中)

一、切片问题

1.1 下面代码会输出什么?

func Test1(t *testing.T) {
    i := make([]int, 5)
    i = append(i, 1, 2, 3)
    fmt.Println(i)

    j := make([]int, 0)
    j = append(j, 1, 2, 3, 4)
    fmt.Println(j)
}

结果:
[0 0 0 0 0 1 2 3]
[1 2 3 4]

1.2 下面代码输出结果是什么?

func TestSlice(t *testing.T) {
    var i []int
    i = append(i, 1, 2, 3, 4, 5, 6)
    a := i[0:4]
    a = append(a, 7)
    fmt.Println(a)
    fmt.Println(i)
}

结果:
[1 2 3 4 7]
[1 2 3 4 7 6]

1.3 下面代码输出结果是什么?

func TestSlice(t *testing.T) {
    var i = []int{1, 2, 3}
    var a []int
    a = append(a, 1, 2, 3)
    fmt.Println(cap(i))
    fmt.Println(cap(a))
}

结果:
3
4

二、函数问题

2.1 下面代码有什么错误

func funcTest(x,y int)(sum int,error){
    return x+y,nil
}

解析:
第二个返回值没有命名,在函数有多个返回值时,只要有一个返回值有命名, 其他的也必须命名。如果有多个返回值必须加上括号(); 如果只有一个返回值且命名也必须加上括号()。 这里的第一个返回值有命名 sum,第二个没有命名,所以错误。

三、defer问题

func f(i int) {
    fmt.Println(i)
}
func Test22(t *testing.T) {
    i := 5
    defer f(i)
    i = i + 10
}

结果
5

func increaseA() int {
    var i int
    defer func() {
        i++
    }()
    return i
}

func increaseB() (r int) {
    defer func() {
        r++
    }()
    return r
}

func Test29(t *testing.T) {
    fmt.Println(increaseA())
    fmt.Println(increaseB())
}

结果:
0
1

func f1() (r int) {
    defer func() {
        r++
    }()
    return 0
}

func f2() (r int) {
    t := 5
    defer func() {
        t = t + 5
    }()
    return t
}

func f3() (r int) {
    defer func(r int) {
        r = r + 5
    }(r)
    return 1
}

func Test30(t *testing.T) {
    fmt.Println(f1())
    fmt.Println(f2())
    fmt.Println(f3())
}

结果:
1
5
1

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code