Golang中遇到的问题
CoderTh 结丹

Golang中常见的问题(持续更新)

前言

这里列举一些我们学习golang时常遇见的问题,他们都是符合golang语言语法的,可以正常的编译,但是可能会出现运行结果错误,或者是由资源泄露的风险

可变参数是空接口类型

当参数的可变参数是空接口类型时,传入空接口的切片时需要注意参数的展开的问题:

1
2
3
4
5
func main(){
var a = []interface{}{1,2,3}
fmt.Println(a)
fmt.Println(a...)
}

不管参数是否展开,编译器都无法发现错误,但是输出是不同的:

[1 2 3]

1 2 3

数组是值传递

在函数调用参数中,数组是值传递,无法通过修改数组类型的参数返回结果:

1
2
3
4
5
6
7
8
func main(){
x := [3]int{1,2,3}
func(arr [3]int){
arr[0] = 7
fmt.Println(arr)
}(x)
fmt.Println(x)
}

必要时需要使用切片。

map遍历时顺序不固定

map是一种散列表实现,每次遍历的顺序都可能不一样:

1
2
3
4
5
6
7
8
9
10
func main(){
m := map[string]string{
"1" : "1",
"2" : "2",
"3" : "3",
}
for k,value:=range m {
println(k,v)
}
}

返回值被屏蔽

在局部变量中,命名的返回值被同名的局部变量屏蔽:

1
2
3
4
5
6
func Foo()(err error){
if err : bar(); err != nill{
return
}
return
}

结尾

本章博客将会一直更新…….

 Comments