007 GO-高级数据类型(指针)
7.1、Go指针 操作符
指针操作操作符:& 和 *
/*
& 是取出内存地址
* 是取出对应内存地址的值
*/
作为地址操作符:
- & 用于取址:&用于一个值上,会取出该值的 指针值
* 用于取值:*用于一个指针值上,会取出该指针指向的那个值。
——可以视为两种相反的操作。
*出现在类型之前:
是其所属类型的 ——指针类型
是一个符号。
如: *Person 和 *[3]string
7.2、指针方法
方法的接收者类型是其所属类型的指针类型,而不是该类型本身,我们可以称其为——指针方法
type Person struct { Name string Gender string Age uint8 Address string }
func (person *Person) Grow() { person.Age++ }
func (person *Person) Move(newAddress string) string { old := person.Address person.Address = newAddress return old } |
7.3 值方法
方法的接收者类型就是其所属类型本身,那么我们就把其叫做——值方法;
func (person Person) Grow() { person.Age++ } |
7.4 指针方法 VS 值方法
方法接收者:
方法的接收者标识符所代表的是该方法当前所属的那个值的一个副本,而不是该值本身。
7.4.1 值方法:
Person类型的Grow方法的接收者标识符person代表的是p的值的一个拷贝,而不是p的值
7.4.2 指针方法:
这时的person代表的是p的值的指针的副本。指针的副本仍会指向p的值。另外,之所以选择表达式person.Age成立,是因为如果Go语言发现person是指针并且指向的那个值有Age字段,那么就会把该表达式视为(*person).Age。其实,这时的person.Age正是(*person).Age的速记法。
示例:
package main
import "fmt"
type MyInt struct { n int }
func (myInt *MyInt) Increase() { myInt.n++ }
func (myInt MyInt) Decrease() { myInt.n-- }
func main() { mi := MyInt{n:0} mi.Increase() mi.Increase() mi.Decrease() mi.Decrease() mi.Increase() fmt.Printf("%v\n", mi.n == 3) } //*MyInt 指针类型会拥有所有的方法(接收者为其指针、基底类型) //MyInt 基底类型仅仅拥有(接收者为其 基底类型的方法) |
7.5 指针类型 VS 基底类型
一个指针类型拥有以它以及以它的基底类型为接收者类型的所有方法,而它的基底类型却只拥有以它本身为接收者类型的方法。
指针类型:*Person
基底类型:Person
7.6 结构体实现接口类型接收类型必须要为【值方法】类型
如果用 指针类型作为接收类型,那么就不是该接口的实现了。
示例:
package main
import "fmt"
type Pet interface { Name() string Age() uint8 } type Dog struct{ name string age uint8 } func(dog Dog)Name()string{ return dog.name } func(dog Dog)Age()uint8{ return dog.age }
func main() { myDog := Dog{"Little D", 3} _, ok1 := interface{}(&myDog).(Pet) _, ok2 := interface{}(myDog).(Pet) fmt.Printf("%v, %v\n", ok1, ok2) } |