golang 易犯錯誤事項

golang 易犯錯誤事項golang

1.
func main()
{ // 錯誤,不能將左大括號放在單獨的行上
fmt.Println("hello there!")
}
2.
var gvar int //not an error數組

func main() {
var one int //error, unused variable
two := 2 //error, unused variable
var three int //error, even though it's assigned 3 on the next line
three = 3app

func(unused string) {
fmt.Println("Unused arg. No compile error")
}("what?")
}
3.未使用導入包
import (
"fmt"
"log"
"time"
)
//能夠使用空白標識符_做爲其包名,以免此編譯失敗
func main() {
}
4.
短變量聲明只能在函數內部使用函數

myvar := 1 //error var myvar = 1指針

func main() {
}索引

5.
使用短變量聲明從新聲明變量接口

func main() {
one := 0
one := 1 //error
}
6.
不能使用短變量聲明來設置字段值
type info struct {
result int
}three

func work() (int,error) {
return 13,nil
}字符串

func main() {
var data info編譯器

data.result, err := work() //error
fmt.Printf("info: %+v\n",data)
}

7.
偶然的變量隱藏

func main() {
x := 1
fmt.Println(x) //prints 1
{
//塊內變量
fmt.Println(x) //prints 1
x := 2
fmt.Println(x) //prints 2
}
fmt.Println(x) //prints 1 (bad if you need 2)
}


8.
不能使用 「nil」來初始化沒有顯式類型的變量

nil標識符能夠用做接口,函數,指針,映射,切片和通道的「零值」。若是不指定變量類型,則編譯器將沒法編譯代碼,由於它沒法猜想類型

func main() {
var x = nil //error

_ = x
}
9
使用 「nil」 切片和映射
正確的
func main() {
var s []int
s = append(s,1)
}
錯誤的
func main() {
var m map[string]int
m["one"] = 1 //error

}

10
字符串不能爲「nil」

func main() {
var x string = nil //error

if x == nil { //error
x = "default"
}
}

11
數組函數參數
Go 中的數組是值,所以當您將數組傳遞給函數時,這些函數會獲取原始數組數據的副本。若是你嘗試更新數組數據,則可能會出現問題
func main() {
x := [3]int{1,2,3}

func(arr [3]int) {
arr[0] = 7
fmt.Println(arr) //prints [7 2 3]
}(x)

fmt.Println(x) //prints [1 2 3] (not ok if you need [7 2 3])
}

12
切片和數組「range」子句下的意外值
Go 中的「range」子句不一樣。它生成兩個值:第一個值是索引,而第二個值是數據。
func main() {
x := []string{"a","b","c"}

for v := range x {
fmt.Println(v) //prints 0, 1, 2
}
}

func main() {
x := []string{"a","b","c"}

for _, v := range x {
fmt.Println(v) //prints a, b, c
}
}
13
切片和數組是一維的
func main() {
h, w := 2, 4

raw := make([]int,h*w)
for i := range raw {
raw[i] = i
}
fmt.Println(raw,&raw[4])
//prints: [0 1 2 3 4 5 6 7] <ptr_addr_x>

table := make([][]int,h)
for i:= range table {
table[i] = raw[i*w:i*w + w]
}

fmt.Println(table,&table[1][0])
//prints: [[0 1 2 3] [4 5 6 7]] <ptr_addr_x>
}
14.
訪問不存在的映射鍵
func main() {
x := map[string]string{"one":"a","two":"","three":"c"}

if v := x["two"]; v == "" { //incorrect
fmt.Println("no entry")
}
}
正確的
func main() {
x := map[string]string{"one":"a","two":"","three":"c"}

if _,ok := x["two"]; !ok {
fmt.Println("no entry")
}
}
15
字符串是不可變的
嘗試使用索引運算符更新字符串變量中的單個字符將致使失敗。字符串是隻讀字節片 (具備一些其餘屬性)。若是確實須要更新字符串,則在必要時使用字節片而不是將其轉換爲字符串類型。

func main() {
x := "text"
x[0] = 'T'

fmt.Println(x)
}

func main() {
x := "text"
xbytes := []byte(x)
xbytes[0] = 'T'

fmt.Println(string(xbytes)) //prints Text}

相關文章
相關標籤/搜索