Go基础学习记录 - Go指南 - 指针接收者

{app.params.name}}{app.params.name}}{app.params.name}}

环境

go version go1.10.1 darwin/amd64

指针接收者

Go可以为指针接收者声明方法。这意味着对于某类型 T ,接收者的类型可以用 *T 的语法。 (此外, T 不能是像 *int 这样的指针。)示例如下

package main

import (
    "fmt"
)

// Rectangle 长方形
type Rectangle struct {
    width, height float64
}

// Area Rectangle的面积
func (v Rectangle) Area() float64 {
    return v.width * v.height
}

// Scale 用给定的值调整比例
func (v *Rectangle) Scale(f float64) {
    v.width = v.width * f
    v.height = v.height * f
}

func main() {
    v := Rectangle{3, 4}
    fmt.Println(v)
    v.Scale(10)
    fmt.Println(v)
    fmt.Println(v.Area())
}


运行后得到如下结果

{3 4}
{30 40}
1200

例如,这里为 *Rectangle 定义了 Scale 方法。

指针接收者的方法可以修改接收者指向的值(就像 Scale 在这做的)。 由于方法经常需要修改它的接收者,指针接收者比值接收者更常用。试着移除 Scale 函数声明中的 * ,观察此程序的行为如何变化。如下

package main

import (
    "fmt"
)

// Rectangle 长方形
type Rectangle struct {
    width, height float64
}

// Area Rectangle的面积
func (v Rectangle) Area() float64 {
    return v.width * v.height
}

// Scale 用给定的值调整比例
func (v Rectangle) Scale(f float64) {
    v.width = v.width * f
    v.height = v.height * f
}

func main() {
    v := Rectangle{3, 4}
    fmt.Println(v)
    v.Scale(10)
    fmt.Println(v)
    fmt.Println(v.Area())
}


运行后得到如下结果

{3 4}
{3 4}
12


若使用值接收者,那么 Scale 方法会对原始 Rectangle 值的副本进行操作。 (对于函数的其它参数也是如此。) Scale 方法必须用指针接受者来更改 main 函数中声明的 Rectangle 的值。

版权声明

durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 博客( https://www.xiaorongmao.com ),版权所有,侵权必究。

本文永久链接: https://www.xiaorongmao.com/blog/23


版权声明

durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 小绒毛的足迹博客( https://www.xiaorongmao.com ),版权所有,侵权必究。

本文永久链接: https://www.xiaorongmao.com/blog/23