变量的作用域|Go笔记

75 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

文章概览

  • 函数参数的传递方式
  • 变量作用域

一、函数参数的传递方式

 前面已经知道函数参数传递的两种方式:值传递和引用类型,值传递的参数是值,而引用类型参数是地址。

 两种方式共同点是传递给函数的都是副本,不同的是值传递是数值拷贝,而引用类型传递是地址的拷贝传递。因为引用类型只需要传递地址,数据量一般较小,效率高,而值类型的传递效率取决于数据的大小,数据越大效率越低,反之效率越高。

值类型和引用类型在内存中的特点

  • 值类型变量直接存储值,内存一般在栈中分配。
  • 引用类型的变量存储的是地址,地址所指向的空间才是真正的数值。引用类型的内存在堆上分配,当没有变量引用这块地址,这块地址就会变成垃圾,由GC回收。

二、变量作用域

  • 局部变量:变量内部声明/定义的变量,作用域仅限于函数内部。
package main

import package main

import "fmt"

func GetD() (int, int) {
    return 100, 200
}
func main() {
    a, _ := GetD()
    _, b := GetD()
    fmt.Println(a, b)
}
  • 全局变量:函数外部声明/定义的变量,作用域在整个包都有效,如果首字母大写,那么作用域在整个程序有效。

代码示例

//变量作用域
package main
 
import (
	"fmt"
)
//全局变量作用域
var Age int = 10
func test() int{
	Age = 20
	fmt.Println(Age)
	return Age
}
func main() {
	fmt.Println(Age)
	f := test()
	fmt.Println(f)
	
}
  • 如果变量在一个代码块中,比如for/if中,则该变量的作用域在该代码块中。

代码示例

package main
import (
   "fmt"
)
 
func main() {
   for i := 0; i <= 5; i++ {
      fmt.Println("i=", i)
   }
 
   var i int // 局部变量
   for i = 0; i <= 5; i++ {
      fmt.Println("i=", i)
   }
 
   fmt.Println("i=", i)
}