Loading

Go语言精进之路读书笔记第8条——使用一致的变量声明形式

Go语言常见的变量声明形式

var a int32
var s string = "hello"
var i = 13
n := 17
var (
    crlf = []byte("\r\n")
    colonSpace = []byte(": ")
)

8.1 包级变量的声明形式

1.声明并同时显式初始化

// Go编译器会自动根据等号右侧的InitExpression表达式求值的类型确定左侧所声明变量的类型
// var variableName = InitExpression
var EOF = errors.New("EOF")

// 以整型值初始化,Go编译器会将之设置为默认类型int;而以浮点值初始化的变量f,Go编译器会将之设置为默认类型float64。
var a = 17
var f = 3.14
// 如果不接受默认类型,而是要显式为包级变量a和f指定类型,那么有以下两种声明方式:
// 第一种
var a int32 = 17
var f float32 = 3.14
// 第二种
var a = int32(17)
var f = float32(3.14)

// 从一致性的角度,Go语言官方更推荐后者

2.声明的延迟初始化

// Go语言会让这些变量拥有初始的"零值"
var a int32
var f float64

3.声明聚类与就近原则

声明聚类:

  • 将同一变量声明放在一个var块中,将不同类的声明放在不同的var块中
  • 将延迟初始化的变量声明放在一个var块中,将声明并显式初始化的变量放在另一个var块中

就近原则:尽可能在靠近第一次使用变量的位置声明该变量。

8.2 局部变量的声明形式

1.对于延迟初始化的局部变量声明,采用带有var关键字的声明形式

当defer后接的闭包函数需要使用err判断函数/方法退出状态时

func Foo() {
    var err error
    defer func {
        if err != nil {
            ...
        }
    }()

    err = Bar()
    ...
}

2.对于声明且显式初始化的局部变量,建议使用短变量声明形式

a := 17
f := 3.14
s := "hello, gopher!"

a := int32(17)
f := float32(3.14)
s := string("hello, gopher!")

3.尽量在分支控制时应用短变量声明形式

如果在声明局部变量时遇到适合聚类的应用场景,也应该毫不犹豫地使用var块来声明多个局部变量

// $GOROOT/src/net/dial.go
func (r *Resolver) resolverAddrList(ctx context.Context, op, network,
	                        addr string, hint Addr) (addrList, error) {
    ...
    var (
        tcp      *TCPAddr
        udp      *UDPAddr
        IP       *IPAddr
        wildcard bool
    )
    ...
}
posted @ 2024-02-01 20:36  brynchen  阅读(7)  评论(0编辑  收藏  举报