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

订阅/RSS Feed

Subscribe