IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    golang新手应注意的几个常见错误

    mckee发表于 2015-11-12 23:09:04
    love 0

    1.简式的变量申明只能在函数内部

    package main
    myvar := 1 //non-declaration statement outside function body
    func main() {
    }

    2.在golang中,nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果未遵循这个规则,则会引发panic。
    package main
    func main() {
    	//这样才行  var x interface{}= nil
    	var x = nil //use of untyped nil
    	_ = x
    }

    3.未初始化的map不能直接赋值,永远用 make 来构造 map
    package main
    func main() {
    	// 先声明map
    	var m1 map[string]string //panic: assignment to entry in nil map
    	// 再使用make函数创建一个非nil的map,nil map不能赋值
    	//m1 = make(map[string]string)
    	// 最后给已声明的map赋值
    	m1["a"] = "aa"
    	m1["b"] = "bb"
    }

    4.go的string是byte slice,想要修改指定索引字符时不能直接修改
    package main
    import "fmt"
    func main() {
    	s := "test"
    
    	//字符串的索引操作返回byte值而非字符
    	fmt.Println(s[1])//101
    
    	sbytes := []byte(s)
    	sbytes[0] = 'y'
    
    	fmt.Println(string(sbytes))
    }

    5.go内建的len()函数返回的时byte数量,如果想要得到unicode字符数量,需要使用“unicode/utf8”包
    package main
    import (
    	"fmt"
    	"unicode/utf8"
    )
    func main() {
    	s := "♥"
    	fmt.Println(len(s)) //3
    	fmt.Println(utf8.RuneCountInString(s)) //1
    }

    6.多行的slice,map,array容易遗漏逗号
    package main
    func main() {
    	x := []int{
    		1,
    		2 //syntax error: need trailing comma before newline in composite literal
    	}
    	_ = x
    }

    7.interface的类型和值会根据用于创建对应interface变量的类型和值的变化而变化,interface变量仅在类型和值为“nil”时才为“nil”。
    package main
    import "fmt"
    func main() {  
        var data *byte
        var in interface{}
        fmt.Println(data,data == nil) //prints: <nil> true
        fmt.Println(in,in == nil)     //prints: <nil> true
        in = data
        fmt.Println(in,in == nil)     //prints: <nil> false
        //'data' is 'nil', but 'in' is not 'nil'
    }



沪ICP备19023445号-2号
友情链接