zoukankan      html  css  js  c++  java
  • Go 指针相关

    Go指针

       Go语言中的指针非常简单,没有偏移和运算,只需要记住两个符号。&取变量地址与*根据地址取值。

       以下是一个简单的示例:

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	var arr = [3]string{"一", "二", "三"}
    	var addArr = &arr
    	fmt.Printf("%p 
    ",addArr) // 打印地址 0xc000062330
    	fmt.Printf("%v 
    ",*addArr) // 根据地址打印值
    }
    
    

    指针类型

       当我们使用&取出一个变量的内存地址时,可以通过%T查看其指针类型。

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

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	var a int = 100
    	fmt.Printf("%T",&a) // *int
    }
    

    指针变量

       以下示例中声明了一个指针变量,但是该指针指向的内存地址还没有被Go进行分配,赋值会引发异常。

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	var a *int
    	*a = 100
    	fmt.Println(*a)
    	// +0x2a exit status 2
    }
    

    new

       new()是一个内置的函数,用于对一个指针变量开辟内存空间。 为了解决上面内存空间未被开辟的问题,可以使用该函数进行开辟。

       注意,实际开发中new用的并不多。

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	var a *int
    	a = new(int) // 开辟内存
    	*a = 100
    	fmt.Println(*a)
    }
    
    

    make

       make()new()相同,都是进行内存空间开辟的,但是它只针对slicemapchan的内存创建,并且它返回的值是这三个类型的本身,这三种类型不是属于值类型,而是属于引用类型,故我们可以不使用变量对其进行接收。

       注意,在声明上述三种类型时,都需要使用make进行内存创建。

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	var b map[string]string
    	b = make(map[string]string, 10)
    	b["first"] = "第一个元素"
    	fmt.Println(b["first"])
    }
    

    本章小结

      

       指针取值与指针地址

       取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。

       变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

      • 对变量进行取地址(&)操作,可以获得这个变量的指针变量。
      • 指针变量的值是指针地址。
      • 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。

       new与make的区别

      1. 二者都是用来做内存分配的。
      2. make只用于slicemap以及channel的初始化,返回的还是这三个引用类型本身;
      3. new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。
  • 相关阅读:
    VIO(4)—— 基于滑动窗口算法的 VIO 系统:可观性和 一致性
    矩阵零空间的含义和物理意义
    Spring Boot 2.5.1 发布!我真跟不上了。。。
    Redis 是并发安全的吗?你确定?
    Spring Boot 集成 Apollo 配置中心,真香、真强大!
    Spring Boot 接入支付宝,实战来了!
    微服务必须具备的 3 个基本功能!
    如何加速 Nginx 的服务响应?
    golang在日志中打印堆栈信息
    Maven
  • 原文地址:https://www.cnblogs.com/Yunya-Cnblogs/p/13757741.html
Copyright © 2011-2022 走看看