go语言指针

199 阅读2分钟

0. 什么是指针

什么是指针

0.5 为什么要有指针

为什么要有指针

  1. 传递数据
  2. 共享数据
  3. 引用,可以改变值,指向不同的地址

用例

  1. 值传递/共享: 引用传递变量
  2. 共享: 对象是指针型数据,赋值a=b a,b共享一块儿内存空间. 非指针变量值会复制一份.

1. go语言指针的理解

2. go语言指针的使用

知识点: 1 go对指针类型的隐式转换 2. 接收者 3. 值方法 4. 指针方法

方法涉及的两个知识点:

  1. 指针方法和值方法的区别 我的理解是结构体是值传递,值方法是一份拷贝到了方法里,对方法里的结构体修改不会反映到原方法中

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())

}

接口实现: 如果结构体方法有指针接收者,但是调用的基本类型为非指针类型,等于没有实现接口中的指针方法

这里我理解是取消了基本类型方法调用中自动取地址的语法糖

知识点

  1. 将变量赋值给另一个变量(包括接口类型变量)为值拷贝,对于接口类型变量来说包含了原变量值的一个副本
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编程