29

Go教程第三篇:变量

 4 years ago
source link: https://studygolang.com/articles/25066
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Go教程第三篇:变量

本文是《Golang系列教程》第三篇文章,它主要讲解golang中变量的用法。

什么是变量

变量是一个内存位置的名称,这个内存位置是用于指定类型的值。在go语言中,有许多不同的语法来声明一个变量。

声明单一变量

声明单一变量的语法: var name type。

package main

import "fmt"

func main() {
    var age int // 变量声明
    fmt.Println("my age is", age)
}

var age int 语句声明了一个名称为age,数据类型为int的变量。我们没有为该变量指定任何值。

如果一个变量没有指定任何值的话,go会自动地把它初始化为该数据类型所对应的零值。

在本例子中,age会被指定一个0值。如果你运行这个程序,你就可以看到下面的输出:

my age is 0

一个变量可以指定为其类型所能对应的任意值。在上面的程序中,age可以被赋值为任意的整数值。

package main

import "fmt"

func main() {
    var age int // variable declaration
    fmt.Println("my age is ", age)
    age = 29 //assignment
    fmt.Println("my age is", age)
    age = 54 //assignment
    fmt.Println("my new age is", age)
}

上面的程序,将产生如下输出:

my age is  0
my age is 29
my new age is 54

声明一个有初始值的变量

在变量声明的时候,可以给定一个初始值。

语法如下:

var name type =initialvalue
package main

import "fmt"

func main() {
    var age int = 29 //变量声明时给定初始值

    fmt.Println("my age is", age)
}

在上面的程序中,age是一个int类型的变量,同时给定了一个初始值29。如果你运行上面的程序

,你可以看到如下输出。这也就表明age已经被初始化了一个29的值。

my age is 29

类型引用

如果变量有一个初始值,Go会自动地根据该初始值推断出此变量的数据类型。因此,如果一个变量有初始值的话,

我们可以在变量声明里面,把类型省略掉。

如果变量使用 var name =initialvalue 进行声明,Go将自动根据初始值推断出变量类型。

在下面的例子中,你可以看到 在age变量声明里面已经没有的int类型了,因为该变量有一个初始值为29,

go可以很轻易地推断出它的类型是int。

package main

import "fmt"

func main() {
    var age = 29 // 自动推断变量类型

    fmt.Println("my age is", age)
}

多变量声明

我们可以在单一的语句中声明多个变量。

其语法如下:

var name1, name2 type = initialvalue1,initialvalue2

具体代码如下:

package main

import "fmt"

func main() {
    var width, height int = 100, 50 //声明多个变量

    fmt.Println("width is", width, "height is", height)
}

如果这些变量有初始值的话,类型也是可以省略的。下面的程序将使用类型推断来声明多个变量。

package main

import "fmt"

func main() {
    var width, height = 100, 50 //"int" 被丢弃了

    fmt.Println("width is", width, "height is", height)
}

上面程序打印结果是: width is 100 height is 50。

正如你猜测的那样,如果没有为width和height指定初始值的话,他们将把0作为他们的初始值。

package main

import "fmt"

func main() {
    var width, height int
    fmt.Println("width is", width, "height is", height)
    width = 100
    height = 50
    fmt.Println("new width is", width, "new height is ", height)
}

上面的程序将输出如下:

width is 0 height is 0
new width is 100 new height is  50

不过有时候,我们或许想在单一的语句中,声明多个具有不同数据类型的变量,这时,怎么办呢?

它的语法如下:

var (
      name1 = initialvalue1
      name2 = initialvalue2
)

下面的程序将使用上面的语法来声明多个不同类型的变量。

package main

import "fmt"

func main() {
    var (
        name   = "naveen"
        age    = 29
        height int
    )
    fmt.Println("my name is", name, ", age is", age, "and height is", height)
}

快捷声明(short hand declaration)

Go 也提供了另一种简洁方式声明变量。也被称为 快捷声明,它使用 := 操作符来做到这一点。

语法如下:

name :=initialvale
package main

import "fmt"

func main() {
    name, age := "naveen", 29 //short hand declaration

    fmt.Println("my name is", name, "age is", age)
}

你如果运行上面的程序,你就可以看到会输出 my name is naveen age is 29。

快捷声明需要为每个变量指定初始值。例如下面的程序就会抛出一个错误: cannot assign 1 values to 2 variables。这是因为age并没有被指定一个值。

package main

import "fmt"

func main() {
    name, age := "naveen" //错误

    fmt.Println("my name is", name, "age is", age)
}

在使用快捷声明时,要保证在:=操作符左侧至少有一个变量是新声明的。如下面的程序:

package main

import "fmt"

func main() {
    a, b := 20, 30 // declare variables a and b
    fmt.Println("a is", a, "b is", b)
    b, c := 40, 50 // b is already declared but c is new
    fmt.Println("b is", b, "c is", c)
    b, c = 80, 90 // assign new values to already declared variables b and c
    fmt.Println("changed b is", b, "c is", c)
}

在上面的程序中,在第八行,b之前已经被声明过了,而c是新声明的。它的运行结果是:

a is 20 b is 30
b is 40 c is 50
changed b is 80 c is 90

反之,如果我们运行下面的程序的话,将是错误的:

package main

import "fmt"

func main() {
    a, b := 20, 30 //a and b declared
    fmt.Println("a is", a, "b is", b)
    a, b := 40, 50 //error, no new variables
}

它将抛出错误:no new variables on left side of := 。这是因为不管是a还是b都是已经在先前已经声明过的。

在操作符:=的左侧没有任何新的变量。

另外,给变量指定的值也可以是运行时计算出来的。像下面的程序:

package main

import (
    "fmt"
    "math"
)

func main() {
    a, b := 145.8, 543.8
    c := math.Min(a, b)
    fmt.Println("minimum value is ", c)
}

在上面的程序中,变量c的值是在运行时期计算出来的,它是a和b的最小值。上面的程序将输出如下:

minimum value is 145.8

由于Go是一个强类型的语言,所以,如果在变量声明时指定了一个数据类型,那么就不允许给该变量指定

另一个数据类型的值。下面的程序就会抛出一个错误: cannot use "naveen" (type string) as type int in assignment。

因为age在声明时指定的数据类型是int,而我们却给其指定了一个string类型的值。

package main

func main() {
    age := 29      // age is int
    age = "naveen" // error since we are trying to assign a string to a variable of type int
}

感谢您百忙之中阅读本文。如果有任何反馈和问题,请您在评论区留言。

备注

本文系翻译之作 原文博客地址


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK