sunwenfei
  • 关于我
  • Golang
    • Goglang基础教程【译】
      • 介绍
        • 安装
        • Hello World
      • 变量、基本类型以及常量
        • 变量
        • 基本类型
        • 常量
      • 函数和包
        • 函数
        • 包
      • 条件、循环流程控制语句
        • if else条件语句
        • switch语句
        • 循环语句
      • 数组、切片、变参函数
        • 数组(Array)
        • 切片(Slice)
        • 变参函数
      • 其他数据类型
        • 映射(Map)
        • 字符串
      • 指针、结构体和方法
        • 指针
        • 结构体
        • 方法
      • 面向对象编程
        • 结构体 vs 类
        • 组合 vs 继承
        • 接口
        • 多态
      • 并发
        • 并发介绍
        • 协程(goroutine)
        • 管道(channel)
        • 带缓存的管道(buffered channel)
        • 协程池
        • 管道选择器(select)
        • 互斥锁(Mutex)
      • Defer
      • 一等公民函数
      • 反射
      • 错误
        • 错误处理
        • 自定义错误类型
        • panic和recover
      • 文件读写
        • 读文件
        • 写文件
    • Golang面向对象编程
    • Golang函数式编程
    • Golang并发编程
    • Golang web服务编程
    • Golang数据结构与算法
  • Shell编程
    • Find命令
  • JavaScript
    • browser
    • Node.JS
    • Deno
  • TypeScript
  • HTTP
    • 【译】通过信鸽理解HTTPS交互原理
  • React
    • React16
      • Hooks
        • 使用React Hooks拉取数据
  • 移动端开发
    • 原生
    • Flutter
    • ReactNative
    • 小程序
  • 前端测试
Powered by GitBook
On this page

Was this helpful?

  1. Golang
  2. Goglang基础教程【译】
  3. 变量、基本类型以及常量

变量

Previous变量、基本类型以及常量Next基本类型

Last updated 6 years ago

Was this helpful?

这是我们的第三节,介绍Golang中的变量相关内容。

什么是变量

变量用来存储某种类型的值,Golang中有若干种不同的声明变量的语句。

声明单个变量

var name type用来声明单个变量。

package main

import "fmt"

func main() {
    var age int // 变量声明
    fmt.Printf("my age is %d\n", age)
}

使用Go Playground在线运行。

前面的语句var age int声明了一个int类型的变量age,但是并没有给该变量赋值。在Golang中,如果一个变量声明时未手动赋值,Golang会自动将该变量初始化为对应类型的零值(注意每种类型都有其独特的零值,比如int类型的零值为0)。这里由于age声明为了int类型,因此Golang自动将该变量初始化为0。运行该程序会输出如下结果:

my age is 0

我们可以给某种类型的变量赋予该类型的任何值,比如这里的age变量,我们可以赋予任何大小的整数值:

package main

import "fmt"

func main() {
    var age int // 变量声明
    fmt.Printf("my age is %d\n", age)
    age = 29 // 给age变量赋值
    fmt.Printf("my age is %d\n", age)
    age = 54 // 给age变量赋另一个值
    fmt.Printf("my age is %d\n", age)
}

该程序输出如下:

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

变量声明的同时赋初值

变量声明的同时可以赋初值,语法如下:var name type = initialvalue。

package main

import "fmt"

func main() {
    var age int = 29 // 变量声明并赋初值
    fmt.Printf("my age is %d\n", age)
}

这段程序中变量age被声明为int类型,同时被赋予了初值29,输出如下:

my age is 29

类型推断

如果一个变量声明的同时并进行了赋值,那么Golang可以自动根据赋予的初值来推断出变量的类型,因此这种情况下声明变量时可以将声明语句var type name = initalvalue中的type字段省掉,变为如下形式:var name = initialvalue。

下面的程序中age变量声明时赋予了初值29,因此Golang可以自动推断出age变量的类型为int。

package main

import "fmt"

func main() {
    var age = 29 // 根据初始值自动推断age类型
    fmt.Printf("my age is %d\n", age)
}

同时声明相同类型的多个变量

在Golang中,单个语句可以同时声明某种相同类型的多个变量,语法如下: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)
}

这段程序中由于name1和name2两个变量声明时并赋予了初值,因此Golang可以推断出变量类型,因此可以省去type字段:var width, height = 100, 50。

如果这两个变量声明时不赋初值,那么就不能省去type字段,这时Golang会自动初始化为零值。

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

同时声明不同类型的多个变量

当然了,Golang也可以同时声明不同类型的多个变量,语法如下:

var (
    name1 = initialvalue1
    name2 = inititalvalue2
    name3 type3
)

举个例子:

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)
}

这里同时声明了3个变量,string类型的name,int类型的age和height,该程序输出如下:

my name is naveen , age is 29 and height is 0

如果我们想要声明的不同类型的多个变量均提供手动初始值,那么也可以采用下面的形式:

package main

import "fmt"

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

变量声明简写形式

Golang提供了一种非常简洁的声明变量的缩写形式,语法如下:name := value,注意这种方法要求手动赋予变量初值。

package main

import "fmt"

func main() {  
    name, age := "naveen", 29 // 变量声明简写

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

执行结果如下:

my name is naveen age is 29

切记,变量声明简写形式要求所有声明的变量都在:=右侧手动赋予初值。下面的程序运行会报错:

assignment mismatch: 2 variable but 1 values

就是因为变量age未在:=右侧手动赋予初值:

package main

import "fmt"

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

    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 := 40, 50之所以合法是因为虽然变量b前面已声明过,但是变量c是新声明的变量,执行结果如下:

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

但是如果是下面的程序,则执行时会报错:

no new variables on left side of :=

是因为变量a,b前面均已声明过。

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
}

Golang中变量赋值不仅可以赋予字面量值,还可以赋予运行时计算结果值。

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被赋予的值即为程序运行时计算结果值。注意,由于Golang是强类型编程语言,因此给变量赋值时只能赋予类型匹配的值,否则会报错。

使用Go Playground在线运行。

使用Go Playground在线运行。

使用Go Playground在线运行。

使用Go Playground在线运行。

使用Go Playground在线运行。

Golang基础教程
点击这里
点击这里
点击这里
点击这里
点击这里
点击这里
Go Playground在线运行
Go Playground在线运行
Go Playground在线运行
Go Playground在线运行
Go Playground在线运行
Go Playground在线运行
Go Playground在线运行