加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang的坑

发布时间:2020-12-16 09:26:41 所属栏目:大数据 来源:网络整理
导读:本文大概总结了本人在 `Golang` 编程工作中遇到的疑难点,最后更新于 `20190523` ? 坑1. 延迟函数参数实时解析 func main() { a()}func a() { i := 1 defer fmt.Println(i) i++} 程序执行的最终结果是 1 ? 坑2. 延迟函数在匿名返回值和命名返回值函数中的不同

本文大概总结了本人在 `Golang` 编程工作中遇到的疑难点,最后更新于 `20190523`

?

坑1. 延迟函数参数实时解析

func main() {
     a()
}
func a() {
    i := 1
    defer fmt.Println(i)
    i++
}

程序执行的最终结果是 1

?

坑2. 延迟函数在匿名返回值和命名返回值函数中的不同表现

func main() {
    fmt.Println(a())
    fmt.Println(b())
}

func a() int {
    var i int
    defer func() {
        i++
    }()
    return i
}

func b() (i int) {
    defer func() {
    i++
    }()
    return i
}

程序执行的最终结果是 0 1

在a函数中,可以理解成Go自动创建了一个返回值 retValue,相当于执行retValue = i,然后检查是否有defer,如果有则执行,再返回刚才创建的返回值retValue

在b函数中,由于返回值在方法定义时已经被定义,所以没有创建retValue的过程,i就是retValue,defer对于result的修改也会被直接返回

?

坑3.程序退出时延迟函数不会被执行

func main() {
    fmt.Println("1")
    defer fmt.Println("0")
    os.Exit(0)
}

程序执行的最终结果是1

?

坑4. 字典的操作不是原子操作

坑5,接口值的返回总是非nil的

底层的interface实现是有一个类型一个内部值,只有在内部值和类型都未设置时(nil,nil),一个接口的值才为 nil

func main() {
    err := FindALL()
    if err != nil {
        fmt.Println(1)
    }
    if err.(*MyErr) != nil {
        fmt.Println(2)
    }
}

type MyErr struct {
}
func (m *MyErr) Error() string {
    return ""
}
func FindALL() error {
    var p *MyErr
    return p
}

程序执行的最终结果是1

?

坑6. 字符串时注意

// TODO

坑7 单例时注意

var once sync.Once

?

参考链接:

https://golang.org/doc/faq#atomic_maps

golang中defer的使用规则

关于 Go defer 对匿名返回值和命名返回值的不同行为

Go语言中defer的一些坑

https://golang.org/doc/faq#nil_error

Go中error类型的nil值和nil

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读