使用go语言没几天,犯过一些错误。这其中多数是因为阅读go语言文档不仔细,少数是因为语言本身的设计问题。如下:

局部变量

Go语言是拥有作用域(在某些语言里叫程序块)的语言,并且同时它支持作用域局部变量,配合Go灵活的变量声明格式,很容易出现变量重复声明而不自知的情况。例如:

package main

import("fmt")

func main(){
    a := 3 // 外部
    if a > 2 {
        a := 4 // 内部
        fmt.Println(a)
    }
    fmt.Println(a)
}

最后的运行结果是:

4
3

在if语句中,a被:=符号声明为{}内的局部变量,这使赋值4这一操作并未作用在外部的a中,这有时会在不经意间制造bug。与go不同,其它拥有类似特性的语言,通常使用更为明显的变量声明方式(如经典的int a = 4;),而不仅仅是在=前加一个冒号。

多个slice很可能共享同一个数组

首先是示例代码

package main

import (
"fmt"
)

func main() {
str := "this is str"

slice0 := []byte(str)
slice1 := slice0[:5]
slice2 := slice0[5:]

fmt.Println(string(slice0))
fmt.Println(string(slice1))
fmt.Println(string(slice2))

slice0[0] = 'T'
slice0[10] = 'R'

fmt.Println(string(slice0))
fmt.Println(string(slice1))
fmt.Println(string(slice2))
}

其运行结果为:

>
网上很多教程,将slice描述成动态数组

发表评论

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