[Effective Go 中文翻译] Methods篇
Posted 凌星An
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Effective Go 中文翻译] Methods篇相关的知识,希望对你有一定的参考价值。
方法可以给任何命名的类型(除了指针和接口interface 类型)定义 ,接收者不必是结构体类型。
在上面对切片的讨论中,我们编写了一个Append 函数。我们可以将其定义为切片上的方法。为此,我们首先声明一个可以将方法绑定到的命名类型,然后将方法的接收者设为该类型的值。
type ByteSlice []byte
func (slice ByteSlice) Append(data []byte) []byte
// Body exactly the same as the Append function defined above.
上面实现的方法需要返回更新后的切片,我们可以将接收者 设置为该类型的指针 ,来消除这种笨拙的返回 ,让方法可以自己更新调用者。
func (p *ByteSlice) Append(data []byte)
slice := *p
// Body as above, without the return.
*p = slice
我们可以将这个方法写的更好,修改这个方法成为标准的Write方法。
func (p *ByteSlice) Write(data []byte) (n int, err error)
slice := *p
// Again as above.
*p = slice
return len(data), nil
*ByteSlice 类型满足 标准的io.Writer 接口 ,很有用。
比如 我们打印下面
var b ByteSlice
fmt.Fprintf(&b, "This hour has %d days\\n", 7)
我们传递ByteSlice类型的地址,因为只有* ByteSlice类型满足io.Write接口。
对此相应的规则是,可以使用指针变量或者变量调用 ,接收者类型为value 的方法 , 只能使用指针变量,调用接收者类型为pointer的方法。
出现上述规则 是因为 pointer methods可以在方法内修改接收者。value methods方法在调用的时候会拷贝接收者,使用指针变量调用value methods方法时,任何修改都会被丢弃。Go语言避免了这个情况发生 。 也有一个有用的特殊情况。当变量是可以取地址的,Go语言会自动取变量地址调用pointer methods 方法。
在上面的例子当中,变量b是可以取地址的,所以使用了b.Write调用了Write方法,编译器会重写为(&b).Write
上面,实现bytes类型切片的Write方法 是为了实现bytes.Buffer
以上是关于[Effective Go 中文翻译] Methods篇的主要内容,如果未能解决你的问题,请参考以下文章
[Effective Go 中文翻译] Initialization篇