1. 指针和基本类型的介绍。

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

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

package main

import (
    "fmt"
)
func main()  {

    num := 10
    fmt.Println("num的地址=",&num)//num的地址= 0xc000064080
}

3) 指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值。

package main

import (
    "fmt"
)
func main()  {

    var num int = 10
    fmt.Println("num的地址=",&num)//num的地址= 0xc000064080

    //声明一个*int类型的指针变量。并且赋值为&num(num的地址)
    var pnum *int  = &num
    fmt.Printf("pnum变量的值=%v \n",pnum)//pnum变量的值=0xc000064080

    fmt.Printf("pnum变量自己的地址=%v \n",&pnum)//pnum变量的地址=0xc00008a020

    fmt.Printf("pnum指针指向的值=%v \n",*pnum)//pnum指针指向的值=10
}

上面的var pnum *int = &num表示了下面几个意思:

  • 声明了指针变量pnum,pnum变量的类型是 *int 。
  • 变量pnum 的值是num变量的地址# 。
  • pnum变量自己的地址是&pnum。

4) 获取指针类型所指向的值,使用:*,比如:var pnum *int = &num, 使用*pnum获取 punm指针指向的值。

fmt.Printf("pnum指针指向的值=%v \n",*pnum)//pnum指针指向的值=10

5)通过指针修改原来变量的值

package main

import (
    "fmt"
)
func main()  {

    var num int = 10
    var pnum *int  = &num
    //改变指针指向的值。也改变了num的值。*pnum=num的值
    *pnum = 99
    //输出:pnum指针指向的值=99,num的值=99
    fmt.Printf("pnum指针指向的值=%v,num的值=%v",*pnum,num)
}

原来变量num的值是10,通过指针修改*pnum = 99,num的值变成了99。

2. 指针的使用细节

1) 值类型,都有对应的指针类型, 形式为 *数据类型,比如: int 的对应的指针就是 *int, float32 对应的指针类型就是 *float32, 依次类推。

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

3. 值类型和引用类型。

常见类型:

1) 值类型:基本数据类型 int 系列, float 系列, bool, string 、数组和结构体 struct

2) 引用类型:指针、slice 切片、map、管道 chan、interface 等都是引用类型。

值类型:变量直接存储值,内存通常在栈中分配;引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在堆。

results matching ""

    No results matching ""