指针、结构体、方法
指针、结构体、方法
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 结构体名字)方法名(参数)(返回值){}
使用:通过结构体 . 的方式调用