• Golang 指针(pointer)


    前言

    在Go里面pointer就是1种可以把内存地址的存储起来的数据类型。我们使用pointer数据类型的变量可以记录下另1个变量的内存地址,方便我们修改这变量的值。

    为什么Go中使用了指针?

    因为Go函数里面传递的参数都是副本,我们如何在函数中修该1个外部变量。我们可以通过记录下值类型变量的内存地址,来达到修改值类型变量的目的。

    区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,只能读取指针的位置,是安全指针,所有Go里面的指针比较简单。

    只需要记住以下几点:

    &变量名: 获取变量的内存地址

    *pointor:通过指针获取指针对应变量的值

    package main
    
    import "fmt"
    
    func main() {
    	n := 28
    	fmt.Println(&n)
    	//1.&变量:获取变量的内存地址
    	p := &n
    	fmt.Printf("%T
    ", p) //*int 存储int变量类型的内存地址的指针
    	//2.*指针变量:获取指针指向变量的值
    	v1 := *p
    	fmt.Println(v1)
    	fmt.Printf("%T
    ", v1)
    }
    

      

    什么是指针

    不管是Python还是Go程序 执行过程中数据(变量)载入内存后,在计算机内存中都有该变量所在的内存地址,这就是指针。

    指针就是1个保存了另1个变量所在内存地址的变量,该变量记录了Xyas变量的内存地址,我们就可以通过指针变量在广袤的内存上快速查找到Xyas变量。对其就行修改。

    package main
    
    import "fmt"
    
    func main(){
    	var a int 
    	a=100
    	b:=&a
    	//变量a的数据类型:int类型,变量b的数据类型*int的指针
    	fmt.Printf("变量a的数据类型:%T,变量b的数据类型%T
    ",a,b )
    	//把变量a的内存地址打印出来
    	fmt.Printf("变量a的内存地址:%p
    ",&a)//&a获取变量的内存地址也就是指针啦!
    	//把变量b的值打印出来
    	fmt.Printf("变量b的值也就是变量a的内存地址为:%p
    ",b)
    	fmt.Printf("变量b的值也就是变量b的值,也就是变量a的内存地址:%v
    ",b)
    	//把变量b的内存地址打印出来:也就是存储变量a的内存地址的内存地址
    	fmt.Printf("变量b的内存地址为:%p
    ",&b)
    
    }
    

      

    在Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:*int*int64*string等。

    指针操作

    package main
    
    import "fmt"
    
    func main() {
    	//基本数据类型在内存中的布局
    	var i int = 10
    	//获取变量i的内存地址
    	fmt.Println("变量i的内存地址:", &i)
    	//声明1个 ptr指针变量,指向1个类型为int的内存地址
    	var ptr *int = &i
    	fmt.Println(ptr)
    	//获取指针的内存地址
    	fmt.Println(&ptr)
    	//通过指针获取变量i对应的值(10)
    	fmt.Println(*ptr)
    	//通过指针修改变量i对应的值
    	*ptr = 222
    	fmt.Println(i)
    
    	//通过指针修改变量的值
    	name := "成龙"
    	age := "18"
    
    	por1 := &name
    	*por1 = "JackCheng"
    	por1 = &age
    	*por1 = "68"
    	fmt.Println(name, age)
    
    }
    

      

    new和make的区别

    前面我知道使用make可以创建1个切片数据类型的变量,并且该slice在没有赋值前,就有默认值(开辟了内存空间);

    make 和new在Go中都是用于申请内存的

    new用于给Go中基本的数据类型申请内存(int/string/bool)返回的是对应数据类型的指针(*int/*string/*bool)

    make用于给复杂数据类型申请内存(slice/map/chanel/struct),返回值=默认值的数据类型本身。

     

    package main
    
    import "fmt"
    
    func main(){
    	var a1 *int  //只是声明int类型的变量,不开辟内存地址
    	fmt.Println(a1)//nil
    	var a2=new(int) //申请1个 int指针的变量,开辟内存地址
    	fmt.Println(a2)
    	*a2=100
    	fmt.Println(*a2)
    
    }
    

      

    see also

  • 相关阅读:
    使用parted对大于2T的磁盘进行分区
    iso系统镜像刻录到光盘和U盘
    戴尔R710服务器安装系统——配置raid
    UltraISO 9.7.1.3519注册码
    H3C交换机配置vlan
    kvm创建新虚拟机
    Windows添加永久静态路由
    gitlab部署步骤+汉化
    php配置php_pdo_mysql模块
    为git服务器配置gitosis管理权限
  • 原文地址:https://www.cnblogs.com/sss4/p/12586637.html
Copyright © 2020-2023  润新知