企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
> ### 指针 * 操作符"&"取变量地址 * 使用"\*"通过指针间接访问目标对象(解引用) ~~~ package main import "fmt" func main() { number1 := 10 var number2 *int = &number1 fmt.Println(number2) fmt.Println(*number2) } ~~~ ~~~ 0xc04200a2a0 10 ~~~ > ### 传值与传指针 * 当我们传一个参数值到被调用函数里面时,实际上是传了这个值的一份copy,当在被调用函数中修改参数值的时候,调用函数中相应实参不会发生任何变化,因为数值变化只作用在copy上 * 变量在内存中是存放于一定地址上的,修改变量实际是修改变量地址处的内存 * 传指针使得多个函数能操作同一个对象 * 传指针比较轻量级 (8bytes),只是传内存地址,我们可以用指针传递体积大的结构体。如果用参数值传递的话, 在每次copy上面就会花费相对较多的系统开销(内存和时间)。所以当你要传递大的结构体的时候,用指针是一个明智的选择 > ### 数组指针和指针数组的区别 ~~~ package main import "fmt" func main() { //数组指针 *[2]int{1,2} number1 := [2]int{1, 2} number2 := &number1 fmt.Println(number2) //指针数组 [2]*int{1,2} number3, number4 := 1, 2 number := [2]*int{&number3, &number4} fmt.Println(number) } ~~~ ~~~ &[1 2] [0xc04200a2d8 0xc04200a2f0] ~~~ > ### 相关阅读 * [C语言指针数组和数组指针](http://c.biancheng.net/cpp/html/476.html) * [Go 语言的内存、指针详解](https://www.jianshu.com/p/44b9429d7bef) * * * ~~~ package main import ( "fmt" "encoding/json" ) func main() { var a int = 1 var b *int b = &a test(a) fmt.Println(a) fmt.Println(test(a)) fmt.Println(test(&a)) //Go 语言的取地址符是 & fmt.Println(&a) fmt.Println(&b) json.Unmarshal() } func test(i interface{})bool{ switch i.(type) { case int: return false case *int: return true default: return false } } ~~~