前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 常见错误

Go 常见错误

作者头像
羊羽shine
发布2019-05-29 16:45:41
5820
发布2019-05-29 16:45:41
举报
文章被收录于专栏:Golang开发Golang开发

:= 变量声明

":=" 是在声明和初始化变量,因此该变量必须是第一次出现, 声明和赋值必须是一气呵成的,不能写成先声明后赋值这种形式,这个必须在函数体内才行。

代码语言:javascript
复制
package main

myvar := 1 //error

func main() {  
}
运行结果:
# command-line-arguments
./hello_world.go:3: non-declaration statement outside function body

go不允许variable := something这种变量的赋值出现在函数体外,但是这种是可以的:

代码语言:javascript
复制
package main

var myvar = 1 

func main() {
}

不能用nil初始化无类型变量

nii可以用于 interfaces, functions, pointers, maps, slices, and channels,但一定得有类型。

代码语言:javascript
复制
package main

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

    _ = x
}
# command-line-arguments
./hello.go:4: use of untyped nil

字符串不能被赋为"空"

代码语言:javascript
复制
package main

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

    if x == nil { //error
        x = "default"
    }
}
./hello.go:4: cannot use nil as type string in assignment
./hello.go:6: invalid operation: x == nil (mismatched types string and nil)

空的slice 和map

slice是可以的

代码语言:javascript
复制
package main

func main() {  
    var s []int
    s = append(s,1)
}

map 数不可以的 panic: assignment to entry in nil map

代码语言:javascript
复制
package main

func main() {  
    var m map[string]int
    m["one"] = 1 //error

}

map 容量

可以指定容量大小 但不可以是有cap 函数

代码语言:javascript
复制
func main() {  
    m := make(map[string]int,99)
    cap(m) //error
}

Strings Can't Be "nil"

字符串不能为空

代码语言:javascript
复制
package main

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

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

字符串默认是""

代码语言:javascript
复制
func main() {
    var x string //defaults to ""

    if x == "" {
        x = "default"
    }
    fmt.Printf("string default:%v",x);
}

数组是引用值类型 修改值需要传递指针

当前不会修改数组里面值的内容

代码语言:javascript
复制
package main

import "fmt"

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])
}

需要使用指针

代码语言:javascript
复制
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 [7 2 3]
}

range

range 遍历包含2个值 第一个是当前的数组下标,第二个才是存储的值

代码语言:javascript
复制
func main() {  
    x := []string{"a","b","c"}

    for v := range x {
        fmt.Println(v) //prints 0, 1, 2
    }
}
代码语言:javascript
复制
func main() {  
    x := []string{"a","b","c"}

    for _, v := range x {
        fmt.Println(v) //prints a, b, c
    }
}

map 的遍历

代码语言:javascript
复制
    x := map[string]string{"one":"a","two":"b","three":"c"}
    if v,ok := x["two"]; !ok { //incorrect
        fmt.Println("no entry")
    }else {
        fmt.Println(v)
    }
}

Strings Are Immutable

字符串是只读形式的字符切片 如果需要修改当前字符里面的字符 需要将字符串转换成 字符切片

代码语言:javascript
复制
x := "text"
    x[0] = 'T'

    fmt.Println(x)
代码语言:javascript
复制
x := "text"
    xbytes := []byte(x)
    xbytes[0] = 'T'

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

JSON编码

The struct fields starting with lowercase letters will not be (json, xml, gob, etc.) encoded, so when you decode the structure you'll end up with zero values in those unexported fields. 首字母小写是无法被json 匹配的

代码语言:javascript
复制
package main

import (
    "fmt"
    "encoding/json"
)

type MyData struct {
    One int
    two string
}
func main() {
    in := MyData{1,"two"}
    fmt.Printf("%#v\n",in) //prints main.MyData{One:1, two:"two"}

    encoded,_ := json.Marshal(in)
    fmt.Println(string(encoded)) //prints {"One":1}

    var out MyData
    json.Unmarshal(encoded,&out)
    fmt.Printf("%#v\n",out) //prints main.MyData{One:1, two:""}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.02.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • := 变量声明
  • 不能用nil初始化无类型变量
  • 字符串不能被赋为"空"
  • 空的slice 和map
  • map 容量
  • Strings Can't Be "nil"
  • 数组是引用值类型 修改值需要传递指针
  • range
  • Strings Are Immutable
  • JSON编码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档