您现在的位置是:首页 > 网站制作 > gogo

Go 语言指针

胜于蓝2013-12-30【go】人已围观

简介Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。接下来让我们来一步步学习 Go 语言指针。我们都知道,变量是一种使用方便的占位符,用于引用计算机内

Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。QkY胜于蓝|优秀个人博客

接下来让我们来一步步学习 Go 语言指针。QkY胜于蓝|优秀个人博客

我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址。QkY胜于蓝|优秀个人博客

Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。QkY胜于蓝|优秀个人博客

以下实例演示了变量在内存中地址:QkY胜于蓝|优秀个人博客

实例

package mainQkY胜于蓝|优秀个人博客
QkY胜于蓝|优秀个人博客
import "fmt"QkY胜于蓝|优秀个人博客
QkY胜于蓝|优秀个人博客
func main() {QkY胜于蓝|优秀个人博客
   var a int = 10   QkY胜于蓝|优秀个人博客
QkY胜于蓝|优秀个人博客
   fmt.Printf("变量的地址: %x\n", &a  )QkY胜于蓝|优秀个人博客
}

执行以上代码输出结果为:QkY胜于蓝|优秀个人博客

变量的地址: 20818a220

现在我们已经了解了什么是内存地址和如何去访问它。接下来我们将具体介绍指针。QkY胜于蓝|优秀个人博客


什么是指针

一个指针变量指向了一个值的内存地址。QkY胜于蓝|优秀个人博客

类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下:QkY胜于蓝|优秀个人博客

var var_name *var-type

var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针。以下是有效的指针声明:QkY胜于蓝|优秀个人博客

var ip *int        /* 指向整型*/
var fp *float32    /* 指向浮点型 */

本例中这是一个指向 int 和 float32 的指针。QkY胜于蓝|优秀个人博客


如何使用指针

指针使用流程:QkY胜于蓝|优秀个人博客

  • 定义指针变量。
  • 为指针变量赋值。
  • 访问指针变量中指向地址的值。

在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。QkY胜于蓝|优秀个人博客

实例

package mainQkY胜于蓝|优秀个人博客
QkY胜于蓝|优秀个人博客
import "fmt"QkY胜于蓝|优秀个人博客
QkY胜于蓝|优秀个人博客
func main() {QkY胜于蓝|优秀个人博客
   var a int= 20   /* 声明实际变量 */QkY胜于蓝|优秀个人博客
   var ip *int        /* 声明指针变量 */QkY胜于蓝|优秀个人博客
QkY胜于蓝|优秀个人博客
   ip = &a  /* 指针变量的存储地址 */QkY胜于蓝|优秀个人博客
QkY胜于蓝|优秀个人博客
   fmt.Printf("a 变量的地址是: %x\n", &a  )QkY胜于蓝|优秀个人博客
QkY胜于蓝|优秀个人博客
   /* 指针变量的存储地址 */QkY胜于蓝|优秀个人博客
   fmt.Printf("ip 变量储存的指针地址: %x\n", ip )QkY胜于蓝|优秀个人博客
QkY胜于蓝|优秀个人博客
   /* 使用指针访问值 */QkY胜于蓝|优秀个人博客
   fmt.Printf("*ip 变量的值: %d\n", *ip )QkY胜于蓝|优秀个人博客
}

以上实例执行输出结果为:QkY胜于蓝|优秀个人博客

a 变量的地址是: 20818a220
ip 变量储存的指针地址: 20818a220
*ip 变量的值: 20

Go 空指针

当一个指针被定义后没有分配到任何变量时,它的值为 nil。QkY胜于蓝|优秀个人博客

nil 指针也称为空指针。QkY胜于蓝|优秀个人博客

nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。QkY胜于蓝|优秀个人博客

一个指针变量通常缩写为 ptr。QkY胜于蓝|优秀个人博客

查看以下实例:QkY胜于蓝|优秀个人博客

实例

package mainQkY胜于蓝|优秀个人博客
QkY胜于蓝|优秀个人博客
import "fmt"QkY胜于蓝|优秀个人博客
QkY胜于蓝|优秀个人博客
func main() {QkY胜于蓝|优秀个人博客
   var  ptr *intQkY胜于蓝|优秀个人博客
QkY胜于蓝|优秀个人博客
   fmt.Printf("ptr 的值为 : %x\n", ptr  )QkY胜于蓝|优秀个人博客
}

以上实例输出结果为:QkY胜于蓝|优秀个人博客

ptr 的值为 : 0

空指针判断:QkY胜于蓝|优秀个人博客

if(ptr != nil)     /* ptr 不是空指针 */
if(ptr == nil)    /* ptr 是空指针 */

Go指针更多内容

接下来我们将为大家介绍Go语言中更多的指针应用:QkY胜于蓝|优秀个人博客

内容 描述
Go 指针数组 你可以定义一个指针数组来存储地址
Go 指向指针的指针 Go 支持指向指针的指针
Go 向函数传递指针参数 通过引用或地址传参,在函数调用时可以改变其值
 

  hou***310705@qq.comQkY胜于蓝|优秀个人博客

QkY胜于蓝|优秀个人博客
2

测试实例:QkY胜于蓝|优秀个人博客

package main

import "fmt"

func main() {
    var a int = 10
    var ip *int
    fmt.Printf("变量的地址:%x\n", &a)
    fmt.Println("变量的地址:", &a)
    ip = &a
    fmt.Println("ip 变量存储的指针地址:", ip)
    fmt.Println("ip 变量存储的指针地址的值:", *ip)
    fmt.Println("ip 变量存储的指针地址的地址:", &ip)
    var ptr *int
    if (ptr != nil) {
        if (ip != nil) {         
            fmt.Println("ptr不是空指针")     
            fmt.Println("ip不是空指针")   
        }else {       
            fmt.Println("ptr不是空指针")      
            fmt.Println("ip是空指针")     
        }   
    } else {  
        if(ip != nil){      
            fmt.Println("ptr是空指针")     
            fmt.Println("ip不是空指针")      
        }else{        
            fmt.Println("ptr是空指针")  
            fmt.Println("ip是空指针")    
        }   
    }
    /*  自学的时候想到能不能使用 switch 优化 for 繁琐的写法,但是发现 case 匹配到后会自动跳出 switch。
    查了一下 select 等方法发现并不适用, 最后发现了 fallthrough 可以很好的用在这里(不过要注意 fallthrough 存在的位置,避免产生逻辑混乱)  */   
    switch {   
        case ptr != nil:   
            fmt.Println("ptr不是空指针")    
            fallthrough  
        case ptr == nil:    
            fmt.Println("ptr是空指针")    
            fallthrough   
        case ip != nil:   
            fmt.Println("ip不是空指针") 
        default:  
            fmt.Println("ip是空指针") 
    }
}

以上代码执行结果为:QkY胜于蓝|优秀个人博客

变量的地址:c420080008
变量的地址: 0xc420080008
ip 变量存储的指针地址: 0xc420080008
ip 变量存储的指针地址的值: 10
ip 变量存储的指针地址的地址: 0xc42008a018
ptr是空指针
ip不是空指针
ptr是空指针
ip不是空指针

楼上对 switch 的 fallthrough 理解大有错误!仅在 switch 处会对大括号内的各个 case 标签进行判断,而使用了 fallthrough 后 case 标签的内容将被无视,无论条件是什么,都仅执行下一条 case 的内容!QkY胜于蓝|优秀个人博客

楼上之所以得到正确的结果,仅仅是因为碰巧,switch 后第一个符合判断的是标签 case ptr == nil,执行其中内容,输出 “ptr是空指针” 后遇到 fallthrough,接着不论 ip 是 nil 与否,都会输出 “ip不是空指针”,然后因为后面没有 fallthrough 了,就此跳出。即便实际上 ip 是空指针,也只会输出 “ip不是空指针”。QkY胜于蓝|优秀个人博客

而如果其实 ptr 不是空指针,ip 却是空指针,那么将输出成:QkY胜于蓝|优秀个人博客

ptr不是空指针
ptr是空指针
ip不是空指针

这样的结果。QkY胜于蓝|优秀个人博客

Tags:

很赞哦! ()

上一篇:Go 语言数组

下一篇:Go 语言结构体

文章评论

当前时间

快速排名

  • 网站建设|万词霸屏,企业软文推广,刷下拉框
  • 快速排名:不用再等SEO三个月,只需3-7天即可把行业关键词覆盖百度搜索引擎首页,点击不收费,排名报表,真实访问量报表一目了然。

合作加盟

  • 扫码请注明来意,否则不会通过
  • 填写商户姓名不要带有“超市”,“便利店” ,“百货”等
  • 扫码成为快钱代理
  • 扫码加站长微信,为您推荐快钱总部负责人
  • 快钱POSS机(电签版)
  • 1,免押版:签约费率快捷交易0.38%,常规交易0.65%
  • 贷记卡单笔≥3000元视为激活
  • 2,,有押版:签约快捷交易0.38%,常规交易0.65%
  • 激活首刷≥99元,扣除99元系统服务费,多出部分shishi到账
  • 电签版ipos参与每月扶持奖励
  • 电签版ipos与Mpos单独考核台均
  • 30台以上有效激活奖励3000元扶持金
  • 当月交易额≥3000元的为活跃用户

本站推荐

站点信息

  • 建站时间:2018-10-24
  • 网站程序:帝国CMS7.5
  • 主题模板《今夕何夕》
  • 文章统计7074篇文章
  • 标签管理标签云
  • 统计数据百度统计
  • 扫描二维码:请注明来意,否则不会通过
  • 微信号:扫描二维码,关注我们
歌名 - 歌手
0:00