关于new的本质:
通过 new关键字 来分配内存,new 函数是实参 是一个type类型,而不是一个具体的数值。 new 函数() 返回的 对应类型的指针。
var *ptr = new(T类型)
Java中 new 类型,就是对象,打印对象就是对象的地址,也没啥毛病,在Go这里貌似也能解释的通。Java中很多时候重新了toString,才会使得输出不再是地址,变成千奇百怪的字符串。
研究代码:
- package main
-
- import "fmt"
-
- func main() {
-
- num := new(int)
-
- fmt.Printf("输出的值: %v \n ", num) // 输出的值: 0xc0000a6058
- fmt.Printf("类型: %T \n", num) // 类型: *int
- fmt.Printf("地址:%v \n", &num) // 地址:0xc0000ca018
- fmt.Printf("指针指向的值: %v \n", *num) // 指针指向的值: 0
-
- }
代码分析:
首先,我们看看 ,我们new 出来的是啥?new 出来的是一个内存 —— 0xc0000a6058;
然后,我们看看输出类型是啥?我们也看到系统给我们的答案是 *int,意味着它是一个指针;
接着,我们运用 “ &变量 ” 的语法, 看下指针的地址:0xc0000a6058 ;
最后,我们运用 “ * 变量 ” 的语法,看下指针指向的值 ,int默认值0。
* star符号的运用,加在变量前面,*作为操作符 来 存 +取 到*p指针指向的内存值;如果在一个类型前面,说明整个"star和类型"都是一个指针类型 。& 操作符可以获取到一个指针,指针的本质就是地址,指向一块内存空间的地址。
参考代码:
- package main
-
- import "fmt"
-
- func main() {
-
- //定义2个int变量。
- i, j := 42, 2701
-
- p := &i //i的地址,p是变量,所以*p就作为操作符,存|取 到p地址的内存值。
- fmt.Println(*p)
- fmt.Printf("%T \n", p) //输出p类型
- *p = 21 //存取p地址指向的的值,即i的值。
- fmt.Println(i)
-
- p = &j //j变量的地址p,
- *p = *p / 37 // *操作符,操作地址的值,左边的*p用于存,右边的*用于取。
- fmt.Println(j)
- }