go语言之变量详解

go语言之变量

1.0、变量初识

变量,其实就香芋给某个值设置一个昵称,此昵称代指当前值。

在Go中变量声明的基本格式为:var 变量名 类型 = 值,例如:

// 声明一个字符串类型的变量name,值为'qzk'
var name string = "qzk"
// 声明一个整型类型的变量 age, 值为18
var age int = 18

1.1. 变量简写

为了能让变量的声明更方便,Go 还提供了一些声明变量的简化方式

  • 省略类型,格式为 var 变量名 = 值
var name = "qzk"
var age = 18

// 再给变量赋值时已知值的类型,所以Go编译器可以自动检测到类型,故可简化编写。
  • 省略var 关键字,格式为:变量名 := 值(推荐这样使用)
name := "qzk"
age := 18

上述的两种简化编写的方式必须是直接赋值操作,即:直接将赋值值给变量,否则无法简化。例如:先声明再赋值时就不能使用简化方式编写

// 先, 声明变量
var name = string
// 给变量赋值
name = 'qzk'

注意:如果变量,只声明不赋值,Go内部其实会给变量默认设置值

// int 默认值为 0
// float 默认值为 0.0
// bool 默认值为 false
// string 默认值为 空字符串
// 指针 默认值为 nil
....

1.2 变量名要求

对于变量名有一下几个要求和建议:

要求:

  • 变量名由 字母、数字、下划线组成,且首个字符不能为数字。
  • 不能使用Go内置的25个关键字
break、default、func、interface、select、case、defer、go、map、struct、chan、else、goto、package、switch、const、fallthrough、if、range、type、continue、for、import、return、var

建议:

  • 变量的命名规则遵循驼峰命名规则,即首个单词小写,每个新单词的首字母大写,例如:numShipsstartDate
  • 见名知意,通过变量名就可以知道变量所代指的值,例如:nameemail

1.3 全局和局部变量

根据变量所在位置不同, 变量有全局和局部变量之分

1.3.1 全局变量

package main
import "fmt"

// 声明全局变量
var country string = "中国"
// 亦可使用
// var country = "中国"
// 不可使用
// country := "中国"
func main(){
  fmt.Println(country)
  country = "China"
  fmt.Println(country)
}

特别提示:Go 中的 全局变量比较特殊,

如果全局变量首字母小写,则只能别当前包中的go文件使用,外部无法使用;

如果首字母大写,则任意文件都可以使用全局变量

可简单理解为:首字母大写表示共有, 首字母小写表示私有(当前包的go文件所有)

1.3.2 局部变量

Go中的变量有作用域之分,每个大括号就是一个作用域,每个作用域中都可以定义相关的局部变量。

package main
import (
"fmt"
)

func main(){
// 声明局部变量,再当前函数可用
  var name string = "qzk"
  fmt.Println(name)
  
  if true {
    // 声明局部变量, 再当前if中可用
    var age = 18
    fmt.Println(age)
  }
  
  // 下面的语句就会报错,因为age 再if括号的作用域中
  // fmt.Println(age)
}


1.4 因式分解

在定义多个变量时候, 可以用过饮食分解的方式进行简化代码。

package main

import "fmt"

/*
var name = "qzk"
var age = 18
var gender string
*/

// 在全局使用
var (
        name1 = "qzk"
        age = 18
        gender string
)


func main(){
        fmt.Println(name1)
        fmt.Println(age)
        fmt.Println(gender)

        // 在局部使用
        var (
                x1 = 123
                x2 = 34
        )
        fmt.Println(x1)
        fmt.Println(x2)
}