基本介绍

值类型参数默认就是值传递,而引用类型参数默认就是引用传递

两种传递方式

1,值传递

2,引用传递

不论是值传递还是引用传递,传递给函数的都是变量的副本,不同的是,值传递也是值的拷贝,引用传递的是地址的拷贝,正常来说,地址拷贝效率高,因为数据量小,而值拷贝决定拷贝的数据大小,数据越大,效率越低


值类型和引用类型

1,值类型:基本数据类型int 系列,float系列,bool,string,数组和结构体struct

2,引用类型:指针,slice切片,map,管道chan,interface等都是引用类型


值传递和引用传递的特点

1,值类型默认是值传递,变更直接存储值,内存通常在栈中分配

2,引用类型默认是引用传递,变量存储的是一个地址,这个地址对应的空间才是真正存储数据的值,内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由GC来回收

3,如果希望函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。


变量作用域

1,函数内部声明定义的变量叫局部变量,作用域仅限于函数内部

2,函数外部声明定义的变量叫全局变量,作用域在整个包都有效,如果其首字母大写,则作用域在整个程序有效

package main

import "fmt"

var age int = 40
var Name string = "tim"

func test () {
age := 20
Name := "jack"
fmt.Println("age=", age)
fmt.Println("Name=", Name)
}

func main() {
fmt.Println("age=", age)
fmt.Println("Name=", Name)
test()
}

Golang的函数传递方式介绍_值类型

3,如果变量是在一个代码块,比如 for/if中,那么这个变量的作用就在该代码块中

package main

import "fmt"


func main() {
for i :=0; i <= 2; i++{
fmt.Println("i=",i)
}

var i int
for i =5; i <= 10; i++{
fmt.Println("i=",i)
}
fmt.Println("i=", i)
}

Golang的函数传递方式介绍_作用域_02