计算机内存就像土地,都是被规划好的。像我家就是一个门牌号25号。张三家就占了三个地址26-28号,有那么一些带π。
我们平时说张三家,都不会说门牌号,编程也是一样:
var 张三家 = "房子、车子、电视、洗衣机..."
这里我们就省略了张三家的地址。实际上张三家代表的就是“西城区青年北路26-28号”这个地址,如果更较真说先后顺序,那是先有这个地址,我们为了方便才给这个地址取个名字,这个名字就是变量。
如果你说要问张三家地址是啥,复杂的样子就是
获取地址(张三家) // 返回一个张三家地址// 实际上地址还隐含着某种方位感,只是我们不提,用导航软件
操作麻烦我们就改一下,懒嘛
// &变量// &variablepoint_张三家 := &张三家
这种能找到某家房子(空间)的东西,我们起个专业术语叫做指针(pointer)。张三家富裕你想去他家捞点东西,对他们家的东西,车,电视啥的进行操作。
*point_张三家
具体是打车去看的,还是百度导航跑着去的,还是自己开车去的,这都不重要。重要的是*point就代表了跑人家里了,是个二哈还可能把人家拆了。
正常情况下人家对你这个人开放什么,你就只能做什么。不能瞎捣鼓。如果张三家是一个只放鱼的冷库,你就只能去存鱼,或者是拿鱼。你要去种麦子那就不行。
那你说我一定要在张三家种麦子,也不是不行,但是咱们有些能力就要深挖才能实现。毕竟这个世界的规则限制了我们,我们程序的规则也是限制着我们。
package mainimport ( "fmt" "reflect")func main() { var zhangSanHome = "房子 车子 电视 电脑" fmt.Println(reflect.TypeOf(zhangSanHome), zhangSanHome) // string 房子 车子 电视 电脑 // 获取张三家的地址指针 zhangSanHomePoint := &zhangSanHome fmt.Println(reflect.TypeOf(zhangSanHomePoint), zhangSanHome) // *string 房子 车子 电视 电脑 // 再取值 zhangSanHomePointValue := *zhangSanHomePoint fmt.Println(reflect.TypeOf(zhangSanHomePointValue), zhangSanHomePointValue) // string 房子 车子 电视 电脑 // 我们捣鼓了一圈 *(&var) 我们又回来了}
感觉跟勺子一样饶了一圈,有啥用?
脱离场景谈病情都是耍流氓
这个还没现实中的例子,假设张三有个弟弟,暂时叫他三弟,他们拥有共同的家;
// 张三的弟弟 sanDi := zhangSanHome fmt.Println(reflect.TypeOf(sanDi), sanDi, &sanDi) fmt.Println(reflect.TypeOf(sanDi), zhangSanHome, &zhangSanHome) // string 房子 车子 电视 电脑 0xc000010260 // string 房子 车子 电视 电脑 0xc000010200
但是你发现,他们的地址都不一样。这种做法没有享受兄弟间的福利,也没有带来额外的风险。
sanDi = "房子 车子 电视 电脑 空气净化器" zhangSanHome = "房子 车子 电视 电脑 燃气泄漏了" fmt.Println(reflect.TypeOf(sanDi), sanDi, &sanDi) fmt.Println(reflect.TypeOf(sanDi), zhangSanHome, &zhangSanHome) //string 房子 车子 电视 电脑 空气净化器 0xc000010260 //string 房子 车子 电视 电脑 燃气泄漏了 0xc000010200
逻辑上共同一个家不存在,所以?
// 张三夫妇 zhangSanWifePoint := &zhangSanHome fmt.Println(reflect.TypeOf(zhangSanWifePoint), *zhangSanWifePoint, zhangSanWifePoint) fmt.Println(reflect.TypeOf(zhangSanHomePoint), *zhangSanHomePoint, zhangSanHomePoint) //*string 房子 车子 电视 电脑 燃气泄漏了 0xc000010200 //*string 房子 车子 电视 电脑 燃气泄漏了 0xc000010200
张三夫妇都是指针类型,指向同一个“家”