Go 常见错误

:= 变量声明

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

package main

myvar := 1 //error

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

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

package main

var myvar = 1 

func main() {
}

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

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

package main

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

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

字符串不能被赋为"空"

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是可以的

package main

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

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

package main

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

}

map 容量

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

func main() {  
    m := make(map[string]int,99)
    cap(m) //error
}

Strings Can't Be "nil"

字符串不能为空

package main

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

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

字符串默认是""

func main() {
    var x string //defaults to ""

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

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

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

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

需要使用指针

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个值 第一个是当前的数组下标,第二个才是存储的值

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

map 的遍历

    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

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

x := "text"
    x[0] = 'T'

    fmt.Println(x)
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 匹配的

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:""}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Golang包——io

    Reader 接口包装了基本的 Read 方法,用于输出自身的数据。Read 方法用于将对象的数据流读入到 p 中,返回读取的字节数和遇到的错误。 如果读到了...

    羊羽shine
  • golang-101-hacks(10)——String

    注:本文是对golang-101-hacks中文翻译。 在Go中string是由不可变的字节数组构成的。一旦赋值,就不能修改字符串的值。例如 In Go, ...

    羊羽shine
  • 正则表达式

    例如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用\bhi\b。

    羊羽shine
  • 很全面的Android面试题

    六月的雨
  • 微信小程序开发实战(27):录音

    通过wx.startRecord和wx.stopRecord方法,可以录制和停止录制音频。如果成功录制音频,会将音频存在临时文件中,并返回临时音频文件名,以便后...

    蒙娜丽宁
  • [日常] 读取队列并循环发信的脚本

    陶士涵
  • 常用编码表

    Text-to-speech function is limited to 200 characters

    botkenni
  • 认知的偏差

    哲学对我们大多数人来说,通常会感觉是浪费时间。但是生活中又存在着诸多哲学,我可以把一件事情做好,但是做到一定的高度和深度就需要考虑哲学元素了。为什么感觉哲学...

    jeanron100
  • 记一次安全培训中对Yii框架数据库操作层若干接口安全性分析的总结

    给开发的同学们进行不定期的安全培训是安全建设中不可缺少的一环,也是非常重要的一环。以我的经验来看,安全培训或者说安全科普不能教条化,不能书面化,必须得动手实践,...

    FB客服
  • 探讨人工智能、深度学习、大数据等术语的定义

    计算机运算对于上世纪80年代的我们来说是件非常兴奋的事,还记得我们第一次启动386DX处理器的场景。对,是”DX”,不是”MX”。尽管没人能够正确说出“DX”在...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券