go - 函数返回指针或者返回 普通对象, 指针与地址详述 pointer address referrence
访问量: 2
refer to:
https://stackoverflow.com/questions/44827175/golang-return-a-pointer-or-pass-a-reference
基本概念: 指针和指针的值
package main import ( "fmt" ) type Person struct { name string age int } func main(){ fmt.Println("=== hihihi , in main") materialIds := []string{ "m1", "m2", "m3" } for i, idStr := range materialIds { fmt.Println(fmt.Sprintf("== i: %s, idStr: %s", i, idStr)) } person := Person { name: "Jim", age: 16, } fmt.Println("=== &person: ", &person) // === &person: &{Jim 16} fmt.Println("=== person: ", person) // === person: {Jim 16} fmt.Println("=== &person.name: ", &person.name) // === &person.name: 0xc000010018 fmt.Println("=== person.name: ", person.name) // === person.name: Jim fmt.Println("=== (&person).name: ", (&person).name) // === (&person).name: Jim fmt.Println("=== &person.age: ", &person.age) // === &person.age: 0xc000010028 fmt.Println("=== person.age: ", person.age) /// === person.age: 16 one := 1 fmt.Println("one: ", one) fmt.Println("&one: ", &one) }
所以结论就是:
1. 就算是基础类型(int, string) , 都可以通过& 获得变量的地址
2. &,* 的优先级低于 . &person.name 实际上就是 &(person.name)
3. struct的指针,可以直接用 .xx 来调用 xx属性,例如: (&person).name 就会获得Jim 这个字符串。
指针在函数中作为参数和返回值
go语言中,func可以返回 普通对象(跟ruby,python一样),也可以返回一个指针(或者叫引用,或者叫地址)
& 用来取地址
* 用来获得某个地址对应的值
例如:
// 注意: 函数的声明中,要用 *Car , 固定就是这样写 func (s *Store) GetCar() *Car { // 返回值中,则使用 & 这个符号 return &Car{Store: s} }也可以返回普通的对象:
func (s Store) GetCar() Car