之前自己是用java 开发,众所周知java 是没有指针的。后来因为工作原因,接触go 语言开发,因为有C 语言的基础,所以对go 的指针没有关心过。觉得不就是一个是地址(指针)传递,一个是值传递嘛。知道今天做业务开发的时候,踩的一个坑,才让我重视go 的指针。
场景表述1:
在 renderCreativePb()这个方法中对 params.ImageCreativeid 进行了赋值操作。然后在RenderCampaignWithCreative()里调用了renderCreativePb(),如下图所示。最后在A方法中(A方法调用了RenderCampaignWithCreative()方法)中取params.ImageCreativeid 的值。
取值的时候发现,无论如何值都取不到。这是为什么呢?明明已经把ImageCreativeid的值放进params里了啊,而也把 params 继续往外传了啊。
经过一番排查终于发现,问题出在点用方法renderCreativePb()的时候,传的是param的备份,如下,params是r.Param的复制,而不是其本身,所以自然他的值是传不出去的
用一张图表述:
场景表述2: 空指针错误、数组越界错误
声明指针1
指针1.属性 正确,不会报错
指针1.指针2 错误,报错空指针
type A struct {
b *B
}
type B struct {
c *C
}
type C struct {
str string
}
func main(){
//空指针问题
var a A
var b B
var c C
c.str = "cde"
a.b.c.str = "abc" //错误:空指针错误
a.b.c = &c //错误:空指针错误
b.c = &c //正确
//数组地址越界
var arr []int
arr[0] = 1 //错误:数组地址越界
arr = append(arr,1) //正确
}