Golang的short variable declaration

Go中,常规声明方式为

var i, j int

也有一种短的方式

i, j := 1, 2

这种方式相当于

var i, j int
i, j = 1, 2

但是短的方式允许重复声明,条件是必须有一个以上重复

i, j := 1, 2
z, j := 3, 4
i, j := 5, 6 // 报错!

我们来看一段代码:

package main

import (
	"fmt"
	"os"
)

var cwd string

func init() {
	cwd, err := os.Getwd()
	if err != nil {
		fmt.Printf("error = %s\n", err)
	}

	fmt.Printf("init: cwd = %s\n", cwd)
}

func main() {
	fmt.Printf("main: cwd = %s\n", cwd)
}

运行结果:

jiajun@debian $ go run fun.go
init: cwd = /home/jiajun/test
main: cwd =

为什么cwd明明已经声明成了全局变量却没有被没改变呢?

https://golang.org/ref/spec#Short_variable_declarations

Unlike regular variable declarations, a short variable declaration may redeclare variables provided they were originally declared earlier in the same block (or the parameter lists if the block is the function body) with the same type, and at least one of the non-blank variables is new.

所以上面的代码想要能正常运行就得:

package main

import (
	"fmt"
	"os"
)

var cwd string

func init() {
    var err error
	cwd, err = os.Getwd()
	if err != nil {
		fmt.Printf("error = %s\n", err)
	}

	fmt.Printf("init: cwd = %s\n", cwd)
}

func main() {
	fmt.Printf("main: cwd = %s\n", cwd)
}

更多文章
  • 2017年必装的VIM插件推荐
  • TCP/IP简明教程 - 从零构建TCP/IP协议(二)连接,断开与拥塞控制
  • TCP/IP简明教程 - 从零构建TCP/IP协议(这次叫PCT协议)
  • Lua Manual 阅读笔记
  • Golang Map 源码阅读与分析
  • MySQL 零碎知识 - MySQL必知必会
  • Golang slice 源码阅读与分析
  • 经典好书推荐(2017)
  • Golang log库 源码阅读与分析
  • 毕业后一年
  • ansible 简明教程
  • 自己写个搜索引擎
  • HTTP 路由的两种常见设计形式
  • Golang的short variable declaration
  • Greenlet和Stackless Python