0. 什么是指针
0.5 为什么要有指针
- 传递数据
- 共享数据
- 引用,可以改变值,指向不同的地址
用例
- 值传递/共享: 引用传递变量
- 共享: 对象是指针型数据,赋值a=b a,b共享一块儿内存空间. 非指针变量值会复制一份.
1. go语言指针的理解
2. go语言指针的使用
知识点: 1 go对指针类型的隐式转换 2. 接收者 3. 值方法 4. 指针方法
方法涉及的两个知识点:
- 指针方法和值方法的区别 我的理解是结构体是值传递,值方法是一份拷贝到了方法里,对方法里的结构体修改不会反映到原方法中
2 . struct类型(及所有自定义类型)可以调用所有值方法,指针类型可以调用所有值方法和指针方法. 但实际上go语言做了转译(or 隐式转换),实际是struct类型可以调用指针方法 下面例子中r.area() 相当于&r.area()
package main
import (
"fmt"
)
type rectangle struct {
width, height int
}
func (r *rectangle) area() int {
return r.width * r.height
}
func (r rectangle) perim() int {
return 2*r.width + 2*r.height
}
func main() {
r := rectangle{10, 5}
fmt.Println(r.area())
fmt.Println(r.perim())
p := &r
fmt.Println(p.area())
fmt.Println(p.perim())
}
接口实现: 如果结构体方法有指针接收者,但是调用的基本类型为非指针类型,等于没有实现接口中的指针方法
这里我理解是取消了基本类型方法调用中自动取地址的语法糖
知识点
- 将变量赋值给另一个变量(包括接口类型变量)为值拷贝,对于接口类型变量来说包含了原变量值的一个副本
package main
import (
"fmt"
)
type shape interface {
area() int
perim() int
}
type rectangle struct {
width, height int
}
func (r *rectangle) area() int {
return r.width * r.height
}
func (r rectangle) perim() int {
return 2*r.width + 2*r.height
}
func main() {
var newr shape = &rectangle{width: 10, height: 5}
fmt.Println(newr.area())
fmt.Println(newr.perim())
//r := rectangle{10, 5}
//fmt.Println(r.area())
//fmt.Println(r.perim())
//p := &r
//fmt.Println(p.area())
//fmt.Println(p.perim())
}
参考文档: 高效的go编程