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

函数参数的传递方式:

基本介绍:

  我们在讲解函数注意事项和使用细节时,已经讲过值类型和引用类型了,这里我们在系统总结一下,因为这是重难点,值类型参数默认就是值传递,而引用类型参数默认就是引用传递。

两种传递方式:

  1)值传递
  2)引用传递

  其实,不管是值传递还是引用传递,传递给函数的都是变量的副本,不同的是,值传递的是值的拷贝,引用传递的是地址的拷贝,一般来说,地址拷贝效率高,因为数据量小,而值拷贝决定拷贝的数据大小,数据越大,效率越低。


值类型和引用类型:

  1)值类型:基本数据类型 int 系列,float系列,bool,string、数组和结构体struct
  2)引用类型:指针、slice切片、map、管道chan、interface 等都是引用类型

 

变量作用域:

说明:

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

func test() {
  //age 和 Name 的作用域就只在test函数内部
  age := 10
  Name := "tom~"
}

func main() {
  //这里是不能调用上面函数的变量的。
}


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

package main
import (
  "fmt"
)

var age int = 50
var Name string = "jack~"

func test() {
  //age 和 Name 的作用域就只在test函数内部
  age := 10
  Name := "tom~"
  fmt.Println("age = ", age)   //10
  fmt.Println("Name = ", Name)   //tom~
}

func main() {
  fmt.Println("age = ", age)   //50
  mt.Println("Name = ", Name)   //jack~

  test()
}


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

  for i := 0; i <= 10; i++ {
    fmt.Println("i=", i)
  }
  // fmt.Println("i=",i)   这里就调用不了for循环中的变量i

练习题:

思考:下面的代码输出什么内容?

var Age int = 20   //ok
Name := "tom"   //这句话相当于执行了下面两句 var Name string  Name = "tom" 所以在编译的时候会报错,赋值语句是不能在函数体外。
func main() {
  fmt.Println("name",Name)
}

 

posted @ 2019-08-14 22:37  我是一只忙碌的小青蛙  阅读(601)  评论(0编辑  收藏  举报