Golang变量作用域

Golang基础 - 变量作用域相关知识点。

变量作用域

在Golang中,变量作用域分为:

  • 本地局部变量
  • 全局变量
  • 参数变量

本地局部变量

定义: 在函数或者语义块({}等)中定义的变量。

生效范围: 定义在函数里面则在整个函数范围内有效; 定义在语义块中则在整个语义块生效。

全局变量

定义:函数外部定义的变量都属于全局变量;全局变量声明必须以 var 开头。

生效范围:当前 package 内有效;如果想要被package外可以访问,全局变量需要以大写开头。

参数变量

定义:函数调用时传递的变量。 生效范围:函数范围内(有可能会传入可变参数的值,取决于传递的参数的类型)

package main

import "fmt"

var x = 0

func print() {
	x = 20
	return
}

func person(age int) int {
	return age
}

func main() {
	/*
	变量作用域的生效范围:
	1. 首先寻找同级作用域内是否有x;
	2. 如果找不到则往上一级寻找x;
	3. 作用域从大到小: 全局>函数>if/for等语句块.
	 */

	if true {
		x := 10
		fmt.Printf("x1: %d\n", x)  // x1: 10
	}

	{
		x := 20
		fmt.Printf("x2: %d\n", x)  // x2: 20
	}

	// 全局变量
	fmt.Printf("x3: %d\n", x)  // x3: 0

	// 局部变量
	print()
	fmt.Printf("x4: %d\n", x)  // x4: 20

	// 参数变量
	info := person(x)
	fmt.Printf("x5: %d\n", info)  // x5: 20
}

在 https://gocn.vip/question/46 上看到的一个问题,例子中用到了嵌套的变量作用域,可以参考下。

package main

import (
	"fmt"
	"log"
	"net/http"
	"sync"
)

var (
	resp *http.Response
	urls = []string{
		"https://www.baidu.com",
		"https://www.sina.com",
		"https://www.amesy.me",
	}
)

func main() {
	var wg sync.WaitGroup

	for _, url := range urls {
		wg.Add(1)
		
		go func(url string) {
			defer wg.Done()
			resp, err := http.Get(url)
			
			if err != nil {
				log.Fatalln(err)
			}
			fmt.Println(url, resp)
		}(url)
	}
	wg.Wait()
}
PREVIOUSWeb工作方式
NEXT数组和切片的相关操作