Go实战--golang新手入门常见错误(The way to go)
生命不止,继续 go go go !!! 今天分享的是在学习、应用golang过程中,遇到的哪些错误。 左大括号不能单独一行 对于诸如C++等语言来说,无论选择哪一种格式,只是形式不同罢了,没有对错之分。但是,对于golang就不一样了,golang中{不能单独一行: package main
import "fmt"
func main()
{ //错误
fmt.Println("hello gopher!")
}
未使用的变量会报错,但是未使用的全局变量是不会报错的 package main
var gvar int //不会报错
func main() {
var one int //未使用,错误
two := 2 //未使用,错误
var three int //即使被赋值了,但是未使用,错误
three = 3
func(unused string) {
fmt.Println("Unused arg. No compile error")
}("what?")
}
未使用的导入package package main
import (
"fmt"
)
func main() {
}
短变量声明只能在函数体内 package main
import (
"fmt"
)
myvar := 1 //错误
func main() {
a := 100 //短变量
a := 101 //错误
a,b := 101, 202 //是可以的,:=左边至少有一个是新声明的
fmt.Println(a)
fmt.Println(b)
}
不能使用nil显示的初始化变量 package main
func main() {
var x = nil //错误
var y interface{} = nil //可以
var z string = nil //错误
_ = x
_ = y
_ = z
}
空在slice和map中的不同 package main
func main() {
var s []int
s = append(s,1)
var m map[string]int
m["one"] = 1 //错误
}
不能将cap内置函数用于map package main
func main() {
m := make(map[string]int,99)
cap(m) //错误
}
数组作为函数参数传递不会退化为指针 package main
import "fmt"
func main() {
x := [3]int{1,2,3}
func(arr [3]int) {
arr[0] = 0
fmt.Println(arr) //输出 [0 2 3]
}(x)
fmt.Println(x) //输出 [1 2 3]
}
用slice代替数组作为函数参数,slice是引用类型 package main
import "fmt"
func main() {
x := []int{1,3}
func(arr []int) {
arr[0] = 0
fmt.Println(arr) //输出 [0 2 3]
}(x)
fmt.Println(x) //输出 [0 2 3]
}
使用range遍历遇到的坑儿 package main
import "fmt"
func main() {
x := []string{"a","b","c"}
for v := range x {
fmt.Println(v) //输出 0,1,2
}
}
你原本想输出 a b c ,但是却输出了 0 1 2,很显然是输出了a b c 所对应的index。遇到这个坑就是对range理解的不够深刻而已,range远远比你想象的更牛,他会同时返回value和index。 package main
import "fmt"
func main() {
x := []string{"a","c"}
for _,v := range x {
fmt.Println(v) //输出 a,b,c
}
}
在string上使用index索引 package main
import "fmt"
func main() {
x := "text"
fmt.Println(x[0]) //输出 116
fmt.Printf("%T",x[0]) //输出 uint8
}
通过len获取字符串的长度 package main
import "fmt"
func main() {
data := "?"
fmt.Println(len(data)) //prints: 3
}
使用switch遇到的坑儿 package main
import "fmt"
func main() {
isSpace := func(ch byte) bool {
switch(ch) {
case ' ': //错误
case 't':
return true
}
return false
}
fmt.Println(isSpace('t'))
fmt.Println(isSpace(' '))
}
我们可以使用fallthrough,也可以一个case后面写多余一个的值: package main
import "fmt"
func main() {
isSpace := func(ch byte) bool {
switch(ch) {
case ' ','t':
return true
}
return false
}
fmt.Println(isSpace('t'))
fmt.Println(isSpace(' '))
}
不允许使用前缀自增 package main
import "fmt"
func main() {
data := []int{1,3}
i := 0
++i //错误
fmt.Println(data[i++]) //错误
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |