往期回顾:
本期看点(技巧类用【技】表示,易错点用【易】表示):
正文开始:
在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的地址,因此遍历后都是一个值,如果想要达到预期需要这样改下:
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])
}
看~
在Go语言中,检查nil是非常必要和重要的。这是因为Go语言中的指针和引用类型在默认情况下是nil,而在尝试访问nil指针或引用类型的成员时,会导致运行时错误。
以下是检查nil的必要性和重要性的几个方面:
下面是两个优雅的示例程序:
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
}
func printLength(s *string) {
if s == nil {
fmt.Println("Received a nil string pointer!")
return
}
fmt.Printf("String length is: %d\n", len(*s))
}
本期分享结束~