指针、结构体、方法

指针、结构体、方法

1. 指针(地址)

指针:指针是一种存储变量内存地址(Memory Address)的变量

- 什么类型的指针,就是在类型前加 *

- 取什么变量的地址,就是在变量前加 &

- 通过指针得到值(解引用),在变量前加*

- 当参数传递,修改会影响原来的值

package main

import "fmt"

func main()  {
    // 1 定义指针用 *
    var a * int
    
    //2 指针的零值
    fmt.Println(a)  // nil

    //3 使用指针 &
    var a *int
    var b int=100
    //a指针指向b  (取谁的地址,就是在谁前面加一个&)
    a=&b
    fmt.Println(a)
    
    //4 了解(骚操作)
    //var c =&a
    var c **int=&a
    var d ***int =&
    fmt.Println(d)
    
    //5 解引用(把指针反解成值)  (在指针变量前加*,表示解引用)
    fmt.Println(*a)
    fmt.Println(***d)

    //6 向函数传递指针参数
    var a int =100
    //在函数中把a的值改成101
    fmt.Println(a)
    test2(&a)
    fmt.Println(a)

    //7 不要向函数传递数组的指针,而应该使用切片
    var a [4]int  = [4]int{1,2,3}
    fmt.Println(a)
    test3(&a)
    //test4(a[:])
    fmt.Println(a)

    //8 go不支持指针运算
    var b int=100
    var a *int=&b
    // 不支持
    //a++

    //9 指针数组和数组指针
    //指针数组---->数组里面放指针
    var a int =10
    var b int =20
    var c int =30
    var d [3]*int=[3]*int{&a,&b,&c}
    fmt.Println(d)

    //数组指针----》指向数组的指针
    var a [3]int=[3]int{1,3,4}
    var b *[3]int=&a
    fmt.Println(b)

}

func test2(a *int)  {
    //解引用然后,自增1
    //*a++
    *a=*a+100
    fmt.Println(*a)
}
func test3(a *[4]int)  {
    //(*a)[0]=999
    //神奇的一幕(go语言处理了一层,如果是数组的指针,直接像操作数组操作就可以了)
    a[0]=999
    //a是地址,如果是数组的地址,会显示成 &[999 2 3]
    fmt.Println(a)
}

func test4(a []int)  {
    a[0]=999
    fmt.Println(a)
}

2. 结构体

结构体是 go 语言中的面向对象,结构体是用户定义的类型,表示若干字段的集合

面向对象当中的类,只有属性 ,没有方法(一系列属性的集合)

定义:type Person struct{ 一堆属性}

使用结构体:a:=Person{} 按位置,按关键字传参

结构体是值类型,默认是是属性的默认值

 

 

 

3. 方法(特殊的函数)

func关键字和函数名之间有个特殊类型接收器

定义:func (a 结构体名字)方法名(参数)(返回值){}

使用:通过结构体 . 的方式调用

 

posted @ 2020-04-24 00:31  Mr沈  阅读(260)  评论(0编辑  收藏  举报