zoukankan      html  css  js  c++  java
  • 【Go】指针 | new函数 | 变量的生命周期

     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 // 1.每次调用f()都会返回不同的结果
     8 // 2.因为指针包含了一个变量的地址,因此如果将指针作为参数调用函数,那将可以在函数中通过该指针来 更新变量的值。
     9 // 3.每次我们对一个变量取地址,或者复制指针,我们都是为原变量创建了新的别名。
    10 // 4.对于在包一级声明的变量来说,它们的生命周期和整个程序的运行周期是一致的。
    11 // 5.在局部变量的声明周期则是动态的:从每次创建一个新变量的声明语句开始,直到该变量不再被引用为止,然后变量的存储空间可能被回收。函数的参数变量和返回值变量都是局部变量。它们在函数每次被调用的时候创建。
    12 // 6.可以通过包一级的变量找到的变量必须在堆上分配(从函数中逃逸),逃逸的变量需要额外分配内存,同时对性能的优化可能会产生细微的影响。
    13 // 7.将指向短生命周期对象的指针保存到具有长生命周期的对象中,特别是保存到全局变量时,会阻止对短生命周期对象的垃圾回收(从而可能影响程序的性能)。
    14 var p = f()
    15 
    16 func main() {
    17     fmt.Println("=====================")
    18     x := 1
    19     p := &x
    20     fmt.Println(p) //0xc42000e240
    21     fmt.Println("==更新指针所指向的变量的值==")
    22     *p = 2
    23     fmt.Println(x) //2
    24     fmt.Println("==指针之间进行相等测试==")
    25     var i, j int
    26     fmt.Println(&i == &i, &i == &j, &i == nil) //true false false
    27     fmt.Println("==获取调用f函数时创建局部变量v的地址==")
    28     fmt.Println(p)
    29     fmt.Println("==通过指针来更新变量的值==")
    30     a := 1
    31     incr(&a)
    32     fmt.Println(incr(&a)) //3
    33 
    34     fmt.Println("==new()==")
    35     b := new(int)
    36     fmt.Println(*b) //0
    37     *b = 10
    38     fmt.Println(*b) //10
    39 
    40 }
    41 
    42 func f() *int {
    43     v := 1
    44     return &v
    45 }
    46 
    47 func incr(p *int) int {
    48     *p++ //只增加p指向的变量的值,并不改变p指针
    49     return *p
    50 }
  • 相关阅读:
    poj 1321
    Cocos2D-html5 公布游戏js编译为jsc
    Android定位开发之百度定位、高德定位、腾讯定位,三足鼎立一起为我所用!
    python 设计模式之 单例模式
    css画电脑键盘
    【C/C++学院】(23)Mysql数据库编程--C语言编程实现mysqlclient
    用DOM4J包实现对xml文件按属性分离。
    MVC4中AJAX Html页面打开调用后台方法实现动态载入数据库中的数据
    贝勒爷教你怎样在Mac上安装Microsoft Office
    6.Swift教程翻译系列——Swift集合类型
  • 原文地址:https://www.cnblogs.com/lizhipengvvip/p/8987280.html
Copyright © 2011-2022 走看看