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

往期回顾:

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

  • 遍历指针数组【易】
  • 检查nil以提升程序安全性和健壮性【技】【易】(打了双标签哦!)

正文开始:

遍历指针数组

在Go语言中,参数传递是通过值传递实现的,无论是基本类型还是复合类型。然而,当涉及到指针和引用类型时,传递方式会有所不同。

比如下面这段代码,猜猜输出的是什么?

go 复制代码
func TestPointSlice(t *testing.T) {
   a := "A"
   b := "B"
   c := "C"

   list := make([]string, 0)
   list = append(list, a)
   list = append(list, b)
   list = append(list, c)

   fmt.Printf("list = %+v \n", list)

   cList := make([]*string, 0)
   for _, str := range list {
      cList = append(cList, &str)
   }

   fmt.Printf("cList = [%+v %+v %+v] \n", *cList[0], *cList[1], *cList[2])
}

答案:

相信大部分同学认为输出的应该也是[A B C],但事实上并不是,因为就是用到了指针,也就是地址传递,cList拼接的是string的地址,因此遍历后都是一个值,如果想要达到预期需要这样改下:

go 复制代码
func TestPointSlice(t *testing.T) {
   a := "A"
   b := "B"
   c := "C"

   list := make([]string, 0)
   list = append(list, a)
   list = append(list, b)
   list = append(list, c)

   fmt.Printf("list = %+v \n", list)

   cList := make([]*string, 0)
   for i := range list {
      cList = append(cList, &list[i])
   }

   fmt.Printf("cList = [%+v %+v %+v] \n", *cList[0], *cList[1], *cList[2])
}

看~

检查nil以提升程序安全性和健壮性

在Go语言中,检查nil是非常必要和重要的。这是因为Go语言中的指针和引用类型在默认情况下是nil,而在尝试访问nil指针或引用类型的成员时,会导致运行时错误。

以下是检查nil的必要性和重要性的几个方面:

  1. 避免运行时错误:在Go语言中,尝试访问nil指针或引用类型的成员会导致运行时错误,程序会崩溃。通过检查nil,可以在访问成员之前确保指针或引用类型不是nil,从而避免运行时错误。
  2. 提高代码健壮性:检查nil可以帮助编写更健壮的代码。在处理指针或引用类型时,始终进行nil检查可以确保程序在处理空值或无效值时不会崩溃,从而提高代码的健壮性。
  3. 代码可读性和可维护性:通过检查nil,可以使代码更具可读性和可维护性。检查nil的代码通常更加清晰明了,因为它明确表达了开发者的意图,即在访问成员之前确保指针或引用类型不是nil。这有助于其他开发者理解代码并更容易进行维护。
  4. 错误处理:检查nil可以作为错误处理的一部分。当函数返回指针或引用类型时,可以通过检查nil来确定函数是否成功执行。如果指针或引用类型是nil,则可以处理相应的错误情况。

下面是两个优雅的示例程序:

  • 打开文件时要及时将文件流关闭
go 复制代码
func readFile(filename string) (content string, err error) {
    file, err := os.Open(filename)
    if err != nil {
        return "", err
    }
    defer file.Close()

    data, err := ioutil.ReadAll(file)
    if err != nil {
        return "", err
    }
    return string(data), nil
}
  • 处理指针前先验证是否为nil
go 复制代码
func printLength(s *string) {
    if s == nil {
        fmt.Println("Received a nil string pointer!")
        return
    }
    fmt.Printf("String length is: %d\n", len(*s))
}

本期分享结束~

相关推荐
情缘晓梦.17 小时前
C语言数据存储
c语言·开发语言
xunyan623417 小时前
第九章 JAVA常用类
java·开发语言
IOT-Power18 小时前
QT 对话框(QDialog)中 accept、reject、exec、open的使用
开发语言·qt
froginwe1118 小时前
ASP Session
开发语言
Smoothzjc18 小时前
👉 求你了,别再裸写 fetch 做 AI 流式响应了!90% 的人都在踩这个坑
前端·人工智能·后端
lbb 小魔仙18 小时前
【Python】零基础学 Python 爬虫:从原理到反爬,构建企业级爬虫系统
开发语言·爬虫·python
Swift社区18 小时前
ArkTS Web 组件里,如何通过 javaScriptProxy 让 JS 同步调用原生方法
开发语言·前端·javascript
Q741_14718 小时前
海致星图招聘 数据库内核研发实习生 一轮笔试 总结复盘(1) 作答语言:C/C++ 链表 二叉树
开发语言·c++·经验分享·面试·笔试
秃了也弱了。18 小时前
FASTJSON库:阿里出品java界json解析库,使用与踩坑记录
java·开发语言·json
_OP_CHEN18 小时前
【从零开始的Qt开发指南】(十九)Qt 文件操作:从 I/O 设备到文件信息,一站式掌握跨平台文件处理
开发语言·c++·qt·前端开发·文件操作·gui开发·qt文件