美文网首页
go 语言开发避坑

go 语言开发避坑

作者: wayyyy | 来源:发表于2022-05-12 00:15 被阅读0次

随工作补充,可以作为代码reveiw的注意点。

不建议在循环中使用defer
闭包循环变量
for _, val := range values {
    go func() {
        fmt.Println(val)
    }
}

正确写法:

for _, val := range values {
    go func(v int) {
        fmt.Println(v)
    }(val)
}
需要判断指针为空
type Foo struct {
    X int
}

func main() {
    var p *Foo
    fmt.Println(p.X)    // panic
}

正确写法:

func main() {
    var p *Point = new(Point)
    fmt.Println(p.Abs())
}

以及在代码中要多做防御编程,需要判断指针是否为nil,否则容易panic

for range 循环是拷贝
s := []int{1, 1, 1}
for _, n := range s {
    n += 1
}
fmt.Println(s) // 输出 1 1 1

解决办法:根据索引去定位修改

s := []int{1, 1, 1}
for i := range s {
    s[i] += 1
}
fmt.Println(s)   
同名变量的作用域
谨慎使用命名返回值
浅拷贝和深拷贝的问题
在defer中返回处理的问题

如下场景:我们会在defer 中做一些处理,但同时也需要把defer中的错误返回给上层。如果按照下面的方式,我们没法做到这一点。

func foo() error {
    fmt.Println("process...")
    err := error(nil)

    defer func() {
        if err == nil {
            err = fmt.Errorf("defer error") // 假设这里报错
        }
        if err != nil {
            fmt.Println("handle defer error")
        }
    }()

    return err
}

输出:


image.png

改进,使用命名返回值:

func foo() (err error) {
    fmt.Println("process...")
    err = error(nil)

    defer func() {
        if err == nil {
            err = fmt.Errorf("defer error") // 假设这里报错
        }
        if err != nil {
            fmt.Println("handle defer error")
        }
    }()

    return err
}

输出:

image.png

相关文章

  • go 语言开发避坑

    随工作补充,可以作为代码reveiw的注意点。 不建议在循环中使用defer 闭包循环变量 正确写法: 需要判断指...

  • 前端学习go语言避坑指南

    本人是前端,最近在学习go,总结一些学习的小点。前端都是通过export default 和import来完成模块...

  • Go避坑指南

    不定期更新 1、windows环境下cmd中修改环境变量失败,不生效问题 通过powerShell 来设置 $en...

  • Go语言入坑

    GO语言基础 认识并安装GO语言开发环境 Go语言简介 Go语言是谷歌2009年发布的第二款开源编程语言 go语言...

  • Go 学习

    go语言局部变量分配在栈还是堆Golang 垃圾回收剖析go语言坑之for range

  • Go语言并发

    Go语言并发 Go语言级别支持协程,叫做goroutine Go 语言从语言层面支持并发和并行的开发操作 Go并发...

  • 五. Go(Go protobuf)

    gopath开发模式和go modules开发模式对比 goland创建项目时没用go mod模式选项的坑 在Go...

  • GO语言学习之路(1)开发环境的安装

    Go语言简介 Go语言是Google开发的开源编程语言,于2009年11月开源,2012年发布Go稳定版。Go语言...

  • go学习计划 2018-07-13

    go语言入门及实战 go web开发 go源码及项目阅读

  • Go Web编程.epub

    【下载地址】 《Go Web编程》介绍如何用Go语言进行Web应用的开发,将Go语言的特性与Web开发实战组合到一...

网友评论

      本文标题:go 语言开发避坑

      本文链接:https://www.haomeiwen.com/subject/zbzrurtx.html