更新于 2019-04-25T01:25:38+08:00

指针

  • 当声明了一个指针变量, 并将一个变量的指针地址赋值给该指针变量, 那么该变量的值可以通过给指针变量加星号获取, 如:
  package main
  
  import "fmt"
  
  func main() {
  	// 声明了一个名为i的int类型的变量, 并赋值为10
  	var i int
  	i = 10
  	// 声明了一个名为point的[int类型的指针]类型的变量, 并赋值为变量i的内存地址
  	var point *int
  	point = &i
  
  	fmt.Printf("i的值为: %d, *point的值为: %d \n", i, *point)
  
  	assertTheTwoVariablesAreEqual(i, *point)
  }
  
  func assertTheTwoVariablesAreEqual(varA, varB interface{}) {
  	varAValue, varAIsInt := varA.(int)
  	varBValue, VarBIsInt := varB.(int)
  
  	if varAIsInt == VarBIsInt && varAValue == varBValue {
  		fmt.Print("i即是*point")
  	}
  }

所以, * 为取值符, 用于获取指针变量所指向的内存地址上的值; & 为取址符, 用于获取变量 (包括指针变量) 的内存地址

PS: 星号+指针变量名=内存地址上的值, 星号+类型/结构体=[类型/结构体的指针]类型

  • 严格意义上来说, go的传参方式只有一种, 那就是 值传递 , 但在编码过程中, 会出现两种写法, 变量传递指针传递 . 两者的区别在于, 前者在程序实际运行中, 在传值的时候会在新的内存地址上复制参数, 并把这个参数的新的副本传入函数中, 这样的话函数内的变量副本无论发生什么改变, 都与函数外的变量无关; 后者的话则是复制了变量的内存地址并把复制出来的新内存地址传入了函数中, 一旦在函数中值发生了改变则在函数外值也会改变.