007 GO-高级数据类型(指针)

http://note.youdao.com/noteshare?id=a296a5c9dae280e443c287e1a765506a&sub=58BE2424C981419E8EBF56EC7A9F298E

 

007 GO-高级数据类型(指针)

7.1、Go指针 操作符

7.2、指针方法

7.3 值方法

7.4 指针方法 VS 值方法

方法接收者:

7.4.1 值方法:

7.4.2 指针方法:

7.5 指针类型 VS 基底类型

7.6 结构体实现接口类型接收类型必须要为【值方法】类型

 

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)

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值