Go关键字--var

var

var关键字用来定义变量,不论定义什么类型的变量,都可以使用var来定义。

var 变量名 [类型] [=] [初始值] 

定义变量时,如果定义的变量没有初始化,则必须指定变量类型;如果变量定义时初始化,则可以不指定类型,由编译器自行推断变量类型。
如定义一个变量名为num的int类型变量方法如下:

var num int
var num int = 8
var num = 8
num := 8

在定义变量时,var关键字可以省略,如使用num:=8来定义变量,就省略了var关键字,而是采用在赋值符号左侧加入了冒号(:=)的方式定义变量。使用 := 的方式定义变量,有限制条件,这种定义变量的方式只能在函数内部进行,也就是只能定义局部变量。如果定义全局变量,不能使用 := 来定义,只能使用var来定义。

在定义变量时,需要合理规划,golang是一门追求简洁的语言,每一个定义的变量都必须被使用,否则会造成编译错误:

...num declared and not used

下边来介绍在一行中定义多个变量的方法。如定义3个int类型的变量,分别是num1, num2, num3,并为这3个变量赋值,写法如下:

// 第一种写法
var num1 int = 1
var num2 int = 2
var num3 int = 3
或者
var num1 = 1
var num2 = 2
var num3 = 3

// 第二种写法
var num1,num2,num3 int = 1,2,3
或者
var num1, num2, num3 = 1,2,3

// 第三种写法
var (
    num1 int = 1
    num2 int = 2
    num3 int = 3
)
或
var (
    num1 = 1
    num2 = 2
    num3 = 3  
)

如上述定义变量的方式中,第二种写法在一行中完成,有些情况下会显得比较简洁。

上述的3个变量,都是同一个类型,即int型,那么在一行中,能否同时定义多个不同类型的变量呢?答案是:可以,但是有前提条件。在一行中同时定义多个不同类型的变量,需要在定义变量时初始化变量,且不能显示的指定变量类型。如定义变量str和num两个变量,str类型为string,num类型为int。定义方法如下:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    str, num := "hello str", 88
    fmt.Println("str value is:", str, " type is:", reflect.ValueOf(str).Kind())
    fmt.Println("num value is:", num, " type is:", reflect.ValueOf(num).Kind())
}

输出结果是:

str value is: hello str  type is: string
num value is: 88  type is: int

上边定义变量str和num时,也可以使用var来定义,而不使用:=,如:

var str, num = "hello str", 88

下边来看几个错误的写法:

错误1var str, num string, int = "hello str", 88 (错误语法格式)
错误2var str string, num int = "hello str", 88 (错误语法格式)
错误3var str, num string = "hello str", 88 (两个变量类型不一致)
错误4var str, num int = "hello str", 88 (两个变量类型不一致)

特殊变量 下划线 (_)

在golang中有个特殊的变量,那就是下划线,将变量赋值给下划线,表示丢弃这个值,写法如下:

var _ = "hello"

那么下划线这个变量能否被引用呢?答案是:不能。下边来一个错误的写法:

// 错误写法示例
package main

import (
    "fmt"
)

func main() {
    var _ = "hello"
    fmt.Println(_)
}

错误信息是:

cannot use _ as value

为什么要使用下划线变量?

在第一章节我们了解到,golang的函数可以返回多个值,有些场景中,我们只需要其中一个返回值,其余返回值用不上,那么我们就可以将用不上的返回值赋值给下划线变量。 如果不赋值给下划线变量,那么就需要定义变量来接收这些值,但是在golang中定义了却又没有使用的变量,无法通过编译,这些无用的返回值给编码造成了不必要的麻烦。

注意事项:

在import导入包时,可以在导入包的前边加上下划线,表示只执行这个包中的init函数。那么导入包时的下划线和变量定义中的下划线是否含义相同?答案是:不是。尽管都是用下划线这个符号来表示,都有丢弃值的操作,但是使用场合不同,意义就不相同,不能混为一谈。

猜你喜欢

转载自blog.csdn.net/hzwy23/article/details/79822787
今日推荐