go语言入门四(复合类型 数组切片 指针)

yunfeitian 2020-05-08

我们学过了基础数据类型 现在学习下复合类型

复合类型:把基础类型封装起来了 。

指针

指针可是c语言中的重头戏,指针数组 数组指针 函数指针 指针函数 回调函数 回调函数的数组 一级指针二级指针三四五 。。。。c语言指针有可以进行判断 进行+-等操作 go语言是不行的

go语言弱化了指针,最多只有二级指针

基础数据类型存放的是值 数

指针存放的是地址,切记是地址

package main

import "fmt"

func main() {

    var a int = 10
    var p  *int = &a

    fmt.Println(p)
    fmt.Println(&a)
}

&就是取地址的意思 &a吧a的地址取出来给了p

指针定义了最好要初始化,要不然后期用了 忘记赋值可就成了野指针

结果 go语言入门四(复合类型 数组切片 指针) 因为p存放的是a的地址 所以地址是一样的

我们如何取出p地址的值那

package main

import "fmt"

func main() {

    var a int = 10
    var p  *int = &a

    fmt.Println(p)
    fmt.Println(&a)

    fmt.Println(*p)
    fmt.Println(a)

}

我们可以用*的方法吧p存的地址值取出来。

结果就是10 10了 

我们再来看看二级指针

package main

import "fmt"

func main() {

    var a int = 10
    var p  *int = &a
    var pp ** int = &p

    fmt.Println(&a)
    fmt.Println(p)
    fmt.Println(*pp)

    fmt.Println(&p)
    fmt.Println(pp)



}

go语言入门四(复合类型 数组切片 指针)

 我们来分析下这段代码,前三个都是打印的a的地址

&a是a的地址毋庸置疑 p存的也是a的地址 pp存放的是p的地址 *pp就是取出p的值也就是a的地址

最后两行 打印的都是p的地址,&p就是p的地址 pp 也是p的值

函数本身也是一种类型,学完了函数来学习闭包函数吧

闭包函数

package main

import "fmt"

func main() {
    a := getStack("龙玉1")
    b := getStack("龙玉2")

    c := a(10)
    d := b(20)

    c = a(10)
    d = b(20)

    fmt.Println(&a, c)
    fmt.Println(&b, d)
//  a 存放的是局部函数的地址
//  b也是存放的匿名函数的地址
//a() b()也就是执行匿名函数
// sum相对于匿名函数来说 则是全局变量,所以sum的被保留了
}

func getStack(name string, ) func(min int) int {
    var sum int = 0

    a := func(min int) int {
        sum += min
        return sum
    }
    return a
}

 函数里面包含一个匿名函数 函数里面的局部变量相对于匿名函数来说 也是全局变量,它会把这个值保存起来,应该是根据执行函数的地址 来存放起来。

具体的我不是很懂,后期需要继续查资料

数组

数组是一片连续的内存存放同种数据类型的一种容器

如下就是开辟可以放五个整型的数组

package main

import "fmt"

func main() {

    var array [5]int = [5]int {1,2,3,4,5}

    fmt.Println(array)
}

打印的结果为 1 2 3 4 5

数组可以放任何类型 包含复合后面 指针都可以

package main

import "fmt"

func main() {

    a := 1
    b := 2
    c := 3
    d := 4
    e := 5

    var parray [5]* int = [5]*int{&a,&b,&c,&d,&e}

    fmt.Println(parray)
}

打印a b c d e 的地址

相关推荐