写点什么

Go 语言开发小技巧 & 易错点 100 例(七)

作者:海风极客
  • 2023-05-02
    河北
  • 本文字数:859 字

    阅读完需:约 3 分钟

往期回顾:



本期看点(技巧类用【技】表示,易错点用【易】表示)


  • 优雅的关闭 Go 程序【技】

  • 指针声明后未赋值前不能直接操作【易】


正文开始

优雅的关闭 Go 程序【技】

在实际的开发中你可能会遇到这样的问题,程序异常终止但自己却浑然不知,程序关闭前消息队列还有部分未消费等等,所以程序不能异常终止,我们可以选择更加优雅的方式进行程序的关闭,话不多说直接上代码:


func main() {  defer func() {    fmt.Println("defer func ...")  }()
fmt.Println("main func ...")
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGINT)
sig := <-ch
fmt.Printf("get signal %+v ...\n", sig)}
复制代码


大家可以先猜猜看这个 main 函数的执行顺序,没错,只会输出main func ...


但是在按 Ctrl+C 或关闭程序时就会输出如下:



因此大家就可以将程序退出前想要执行的函数放在 defer 函数中或者放在<-ch 后,已达到在程序终止前执行一些必要的程序。

指针声明后未赋值前不能直接操作【易】

Go 语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无须拷贝数据。关于值传递和引用传递大家可以参考我的这篇文章:《细说值传递、引用传递和地址传递》


Go 语言中的指针操作非常简单:&(取地址)和*(根据地址取值)。我们在声明一个指针时可以有两种方式:


  • var stu *Student

  • stu := &Student{}


代码实例:


type Student struct {   Name string}
func main() { var stu Student fmt.Println(stu.Name)
var stuP *Student stuP = &Student{} //如不进行赋值则会报错 fmt.Println(stuP.Name)}
复制代码


如果不进行赋值 IDE 则会进行提示:



发生空指针异常:



所以大家平时要注意指针变量的使用哈。


本期到此结束~

发布于: 刚刚阅读数: 2
用户头像

海风极客

关注

做兴趣使然的Hero 2021-01-14 加入

Just do it.

评论

发布
暂无评论
Go语言开发小技巧&易错点100例(七)_三周年连更_海风极客_InfoQ写作社区