golang method(方法)

目录

概述

语法

 func (recever Type) funcName(参数..) {}

使用方法

 方法与函数

指针接收者的使用场景

1. 需要修改接收者指向的值

 总结


概述

在go中, 方法就是有接收者的函数, 只有接收者可以调用该函数, 在定义函数的时候把接收者放在函数名之前并指定类型即可.

语法

 func (recever Type) funcName(参数..) {}

使用方法

接收者调用方法时分为两种情况: 值类型, 指针类型

调用值类型接收者方法时, 方法内接收到调用者的拷贝值, 修改拷贝值并不会影响到调用者

调用指针类型接收者方法时, 调用者既能是值也可以是指针, 如果是值方法内部则接收到值的内存地址.

package main

import "fmt"

type Person struct {
    name string
    age int
}

func (man Person) ValueTest(age int) {
    man.age = age
    fmt.Printf("调用值类型方法: man的地址是%p, man的值是%v\n", &man, man)
}

func (man *Person) PointerTest() {
    fmt.Printf("调用指针类型方法: man的地址是%p, man的值是%v\n", man, *man)
}

func main() {
    kitty := Person {"kitty",18}
    kitty.ValueTest(20)   // ValueTest(d)
    kitty.PointerTest() // PointerTest(&d)
    fmt.Printf("kitty的地址: %p, kitty的值%v\n", &kitty, kitty)
}

可以看到调用值类型方法时函数内访问的是调用者的副本, 调用指针类型方法时函数内访问的是调用者的地址

 方法与函数

不同点 : 

1. 方法通过接收者调用, 函数只能普通调用

2. 接收者可以调用值类型和指针类型方法, 函数调用如有参数必须符合其规定类型

相同点 : 

1. 值类型方法内部访问调用者和函数访问参数都是原值的副本

package main

import "fmt"


func ValueTest(num int) {
    num = 99
    fmt.Printf("调用函数: num的地址是%p, num的值是%v\n", &num, num)
}

func main() {
    total := 20
    ValueTest(total)
    fmt.Printf("total地址是%p, total的值是%v\n", &total, total)
}

 

指针接收者的使用场景

1. 需要修改接收者指向的值

2. 值接收者指向的值占用内存极大的时候 (因为值接收者方法内部访问的是值的副本, 副本在内存中也占优空间)

 总结

1. 方法是有接收者的函数, 通过符合类型的接收者调用

2. 调用值类型接收者方法, 内部访问接收者的拷贝

3. 调用指针类型接收者方法, 内部访问接收者的地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值