指针:一个指针指向了一个值的内存地址。类似于变量和常量,再使用指针前你i需要声明指针。

指针声明格式如下:

*是取指针的值,&是取变量的指针

var var_name *var-type           // var-type为指针类型,var_name为指针变量,*号用于指定变量是作为一个指针

 var ip *int    // 指向整型  声明指针变量

 var fp *float32   //指向浮点型

 var a int = 20  // 声明实际变量

 ip = &a  // 指针变量的存储地址

fmt.Printf("a 变量的地址是:%x\n",&a)    // a 变量的地址是:c00000a0a8
fmt.Printf("ip 变量存储的指针地址:%x\n",&ip)  // ip 变量存储的指针地址:c000006028
// 使用指针访问值
fmt.Printf("*ip 变量的值:%d\n",*ip)     // *ip 变量的值:20


*和&有什么区别
&是取地址符号,即取得某个变量的地址,如;&a
*是指针运算符,可以表示一个变量是指针类型,也可以表示一个指针变量所指向的存储单元,也就是这个地址所存储的值


 

空指针:当一个指针被定义后没有分配到任何变量时,他的值为nil(nil指针,也被成为i空指针)

nil 再概念上和其他语言的null,Nine,NULL一样,都指代零值或空值,一个指针变量通常缩写为ptr

var ptr *int

fmt.Printf("ptr 的值为:%x\n",ptr)   // ptr 的值为:0
// 空指针的判断
//if (ptr != nil) // ptr 不是空指针
//if (ptr == nil) // ptr 是空指针
 

var new和make的区别

var 用来声明一个变量,并指明变量的数据类型(不会分配内存)。

 new和make都是用来内存分配的。make用于内建模型(map,slice,和channel)的内存分配。new用于各种类型的内存分配

从返回值上来说make返回的是引用类型本省;而new返回的是指向类型的指针

定义:func new(Type) *Type

new的主要特性:

  内建函数new用来分配内存,他的第一个参数是一个类型,不是一个值,他的返回值是一个指向新分配类型零值的指针

自己实现new功能:

func newInit() *int {
  var i int
  return &i
}

type Rect struct {
width float64
herght float64
}

func (r *Rect) size()float64{
return r.width * r.height
}

func main() {
someInt := newInit()
fmt.Println(someInt) //
0xc00000a0b8 打印出来是一个指针
someInt_1 := new(int)
fmt.Println(someInt_1) // 0xc00000a0f0 效果与这个一样
}
make的主要特性
官方文档描述如下:
        内建函数make用来为slice,map或chan类型分配内存和初始化一个对象(注意只能用在这三种类型上),跟new类似,第一个参数也是一个类型
        而不是一个值,跟new不同的是,make返回类型的引用而不是指针,而返回值也依赖于具体传入的类型。
    具体说明如下:
        slice:第二个参数size指定了它的长度,它的容量和长度相同 eg:make([]int,0,10)
        Map:根据size大小来初始化分配内存,不过分配后的map长度为0,如果size被忽略了,那么会在初始化分配内存时分配一个小尺寸的内存
        Channel:管道缓冲区依据缓冲区容量被初始化。如果容量为0或者忽略容量,管道是没有缓冲区的
总结:new的作用是初始化一个指向类型的指针(*T),make的作用是为slice,map,或chan初始化并返回切片本身

 

posted on 2022-03-26 13:29  輪滑少年  阅读(60)  评论(0编辑  收藏  举报