Go 常见的 mistake(上)

69 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

这里列举的是除了编辑器能够显而易见的提示的错误,比如 开始 "{" 不能独占一行,定义的变量没有使用造成的问题等,这里就不再赘述了

不要使用类似 var a*b 声明变量,这会让你混淆指针声明和乘法运算

package main

import "fmt"

type b struct {
   
}
func main() {
   // 你不细看,还真的有点...
   var a *b
   
   fmt.Println(a)
}

注意使用短式变量声明

短式变量 ":=" 是定义的块级作用域的局部变量,因此在你用的时候注意 = 和 := 在下面的情况,因为你有可能只是重新赋值,但是手误写错了,但是编译器是不会报错的,在块状作用域里,上面的变量的n 就会被隐藏

func main() {  
    n := 2
    fmt.Println(n)     //prints 2
    {
        fmt.Println(n) //prints 2
        n := 3
        fmt.Println(n) //prints 3
    }
    fmt.Println(n)     //prints 2 
}

image.png

slice 和 map 的初始化问题

1.slice 和 map var 定义后都是 nil,但是 append 给 slice 不会报错,map 则需要初始化 2.创建 slice map、chan 的时候尽量都用 make

package main

import "fmt"

func main() {
   var slice []int
   slice = append(slice, 1)
   fmt.Printf("%v", slice)

   var m map[string]int // m = nil
   
   // m:=new(map[string]int) //m = nil
   // m:= make(map[string]int) // m 被初始化了
   m["1"] =1 // error
   
   fmt.Printf("%v", m) 
}

不要在 for-range 循环中使用一个值去改变自身的值

因为 for-range 中的迭代值是值拷贝,比如下面的例子

package main

import "fmt"

type User struct {
   money float32
}

func main() {

   users := []User{
      {money: 100},
      {money: 200},
      {money: 300},
   }
   for _, u := range users {
      u.money += 1000
   }
fmt.Printf("%v",users)
}

最后结果是 [{100} {200} {300}]

使用len()计算string的长度

内建的len()函数返回的是byte的数量 java 案例

String s = "♥";
System.out.println(s.length());

go 案例

package main

import "fmt"

func main() {
   data := "♥"
   fmt.Println(len(data)) //prints: 3
}