37

(八)golang--复杂类型之指针

 4 years ago
source link: http://www.cnblogs.com/xiximayou/p/11831091.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

首先我们要明确:

(1)基本数据类型:变量存的就是值,也叫值类型;

(2)获取变量的地址,用&,例如var num int,获取num的地址:#

(3)指针类型:变量存的是一个地址,这个地址指向的空间存的才是值,例如var ptr *int = #

(4)获取指针类型所指向的值,使用*,例如var *ptr int,使用*ptr获取ptr指向的值;

package main

import (
    "fmt"
)

func main() {
    var num int = 1
    var ptr *int = #
    fmt.Println("num的地址是:", #)
    fmt.Println("ptr的值是:", ptr)
    fmt.Println("ptr的地址是:", &ptr)
}

2Yr6Jbb.png!web

ptr是一个指针,它的值是num的地址,同时,它自己也会有一个地址。我们可以通过地址定位到变量并改变变量的值:

package main

import (
    "fmt"
)

func main() {
    var num int = 1
    var ptr *int
    fmt.Println("num的值是:", num)
    ptr = #
    *ptr = 10
    fmt.Println("num的值是:", num)
}

QJZvmi2.png!web

我们还可以通过切换指针的值来改变不同变量的值:注意指针类型与变量类型之间要匹配。

package main

import (
    "fmt"
)

func main() {
    var num1 int = 1
    var num2 int = 2
    var ptr *int
    fmt.Println("num1的值是:", num1)
    fmt.Println("num2的值是:", num2)
    ptr = &num1
    *ptr = 10
    ptr = &num2
    *ptr = 20
    fmt.Println("num1的值是:", num1)
    fmt.Println("num2的值是:", num2)
}

j2qeMvY.png!web

指针使用细节:

(1)值类型,都有对应的指针,形式为*数据类型,比如int对应的指针就是*int,float32对应的指针就是*float;

(2)值类型包括:基本数据类型int系列、float系列、bool、string、数组和结构体;

值类型和引用类型:

(1)值类型包括:基本数据类型int系列、float系列、bool、string、数组和结构体;

(2)引用类型:指针、slice切片、map、管道channel、interface等;

值类型和引用类型的区别:

(1)值类型,变量直接存储,内存通常在

中分配;

(2)引用类型:变量存储的是一个地址,这个地址对应的空间才是真正存储的数据值,内存通常在堆上分配,当没有任何变量引用这个地址时,改地址对应的数据空间就是一个垃圾,由GC来回收;


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK