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

      指针:

        指针是一种数据类型,用来存储值的内存地址,为了便于理解,我们也可以把指针理解为内存地址。

        指针类型只占用内存4个或8个字节

        指针类型变量也需要一块内存空间存储值,指针变量的值就是它所指向数据的内存地址,而普通变量的值就是存放的具体数据。

        不同的指针类型变量之间无法互相赋值

      Go语言指针:

        区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。Go语言中的操作非常简单,只需要记住两个符号:&(取地址)和*(根据地址取值)

        Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量内存地址的指针变量。传递数据使用指针,而无需拷贝数据

        每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。go语言中取地址符是 & ,放到一个变量前使用就会返回这个变量的内存地址

        在 Golang 语言中,类型名称前加 * 表示该类型是指针类型。

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

        1)什么是指针?

          一个指针变量指向了一个值的内存地址

          类似于变量和常量,在使用指针时需要先声明指针

          

        2)声明指针

          在Go语言中,指针定义有三种方式:

            ①:使用取地址符 & 获取变量的指针(内存地址)

            ②:使用var关键字声明指针变量,使用var关键字声明的变量不能直接赋值和取值,因为它还没有内存地址,它的值是nil

              var var_name *var_type 如:var a *int //一个指向整形的指针
              var_type为指针类型,var_name为指针变量名,*号用于指定变量是作为一个指针

            ③:使用内置的new函数来声明指针类型的变量,new函数接收一个参数,可以传递类型给它,返回值是传递类型的指针类型

        3)指针使用流程:

          ①:定义指针变量

          ②:为指针变量赋值

          ③:访问指针变量中指向地址的值(在指针类型前面加上 * 号来获取指针所指向的内容)
         

            var ptr *string // 定义指针
            ptr = &a // 为指针赋值
            b := *ptr // 访问指针的值

           

          指针操作:

            指针操作包括取值和修改

            取值:就是获取指针指向的值,只需在指针变量前加 * 

            修改:就是修改指针指向的值,需要注意的是使用var关键字声明的指针变量不能直接赋值和取值,因为它还没有分配内存,它的值为nil,可以使用内置函数new给它分配内存。

        4)go空指针:

          当一个指针被定义后没有分配任何变量时,它的值为nil,nil指针也称为空指针

          nil在概念上和其他语言的null,None一样,都指代零值或空值

        5)指针作为函数参数

          Go语言允许向函数传递指针,只需要在函数定义的参数上设置为指针类型即可。

          在Go语言中,函数传递参数只有值传递,传递的实参都是参数原始值的拷贝副本,所以我们传递值类型的参数时,修改参数的值,原始数据不会被修改。

          但是,如果是指针类型的参数,修改参数的值,原始数据也会被修改,原因是指针类型的参数存储的是内存地址,并且和实参的内存地址相同

    复制代码
       var a int = 100
       var b int= 200
    
       swap(&a, &b);
    
    func swap(x *int, y *int) {
       var temp int
       temp = *x    /* 保存 x 地址的值 */
       *x = *y      /* 将 y 赋值给 x */
       *y = temp    /* 将 temp 赋值给 y */
    }
    复制代码

        

        6)指针接收者

          在Go语言中,定义一个方法,接收者可以是值类型和指针类型,二者都可以调用方法,因为Golang编译器会自动转换,所以二者是等价的。

          那么,应该在什么时候使用指针接收者呢?

            ①:如果需要修改接收者,可以使用指针修改指针指向数据的值

            ②:如果接收者是非map、slice、channel类型(因为这三种类型本身就是引用类型),并且数据比较大,可以使用指针来节省内存

          

    END.

  • 相关阅读:
    清除浮动的集中方式
    css动画
    [Asp.net]c#中的斜杠和反斜杠
    C# ASPX页面做上传提示:超过了最大请求长度,解决方法
    在asp.net中用客户端上传控件上传文件( 需要注意的)
    jquery clone 与 clone(true) 的区别
    【转载】用div+css模拟表格对角线
    .net2.0中的Json序列化数据
    jquery操作checkbox的选中与不选中,解决只有一次有用。
    转:不同服务器数据库之间的数据操作[含远程数据库备份]
  • 原文地址:https://www.cnblogs.com/yangyongjie/p/15681236.html
Copyright © 2011-2022 走看看