关于new的本质:

        通过 new关键字 来分配内存,new 函数是实参 是一个type类型,而不是一个具体的数值。 new 函数() 返回的 对应类型的指针。

var *ptr = new(T类型)

        Java中 new 类型,就是对象,打印对象就是对象的地址,也没啥毛病,在Go这里貌似也能解释的通。Java中很多时候重新了toString,才会使得输出不再是地址,变成千奇百怪的字符串。 

研究代码:

  1. package main
  2. import "fmt"
  3. func main() {
  4. num := new(int)
  5. fmt.Printf("输出的值: %v \n ", num) // 输出的值: 0xc0000a6058
  6. fmt.Printf("类型: %T \n", num) // 类型: *int
  7. fmt.Printf("地址:%v \n", &num) // 地址:0xc0000ca018
  8. fmt.Printf("指针指向的值: %v \n", *num) // 指针指向的值: 0
  9. }

代码分析:

        首先,我们看看 ,我们new 出来的是啥?new 出来的是一个内存 —— 0xc0000a6058;

        然后,我们看看输出类型是啥?我们也看到系统给我们的答案是 *int,意味着它是一个指针;

        接着,我们运用 “ &变量 ” 的语法, 看下指针的地址:0xc0000a6058 ;

        最后,我们运用 “ * 变量 ” 的语法,看下指针指向的值 ,int默认值0。

        

        * star符号的运用,加在变量前面,*作为操作符 来 存 +取  到*p指针指向的内存值;如果在一个类型前面,说明整个"star和类型"都是一个指针类型 。& 操作符可以获取到一个指针,指针的本质就是地址,指向一块内存空间的地址。

        参考代码:

  1. package main
  2. import "fmt"
  3. func main() {
  4. //定义2个int变量。
  5. i, j := 42, 2701
  6. p := &i //i的地址,p是变量,所以*p就作为操作符,存|取 到p地址的内存值。
  7. fmt.Println(*p)
  8. fmt.Printf("%T \n", p) //输出p类型
  9. *p = 21 //存取p地址指向的的值,即i的值。
  10. fmt.Println(i)
  11. p = &j //j变量的地址p,
  12. *p = *p / 37 // *操作符,操作地址的值,左边的*p用于存,右边的*用于取。
  13. fmt.Println(j)
  14. }