前言
这是Go常见错误系列的第14篇:过度使用getter和setter方法。
素材来源于Go布道者,现Docker公司资深工程师Teiva Harsanyi。
本文涉及的源代码全部开源在:Go常见错误源代码,欢迎大家关注公众号,及时获取本系列最新更新。
常见错误和最佳实践
现状
写Java或者C++的人,可能会习惯下面的编程模式:
- 将不希望外部直接访问的类成员变量设置为private私有成员。
- 在类里定义public的get和set方法,用于外部获取和修改这个成员变量的值。get方法我们叫做getter,set方法叫做setter。
这是一种数据封装模式,在Java和C++里被广泛使用。
但是在Go语言里,官方从来没有建议使用getter和setter,我们可以直接访问结构体里的成员变量。
成员变量的可见性通过结构体标识符首字母大小写以及成员变量首字母大小写来控制到package这个层面。
- 如果结构体要被其它package使用,那结构体的标识符或者说结构体的名称首字母要大写。
- 如果结构体的成员要被其它package使用,那结构体和结构体的成员标识符首字母都要大写,否则只能在当前包里使用。
举个Go标准库里的time.Timer结构体的例子:
// The Timer type represents a single event.
// When the Timer expires, the current time will be sent on C,
// unless the Timer was created by AfterFunc.
// A Timer must be created with NewTimer or AfterFunc.
type Timer struct {
C <-chan Time
r runtimeTimer
}
Timer结构体定义如上所示,里面有一个成员变量C
用于接收Timer到点后的当前时间。
Timer和C都是大写,所以我们可以直接在下面的代码里访问Timer里的成员变量C拿到当前时间。
package main
import (
"fmt"
"time"
)
func main() {