August Rush

一个还在努力成长的小火汁!

游龙当归海,海不迎我自来也。

We create our own demons.

You can reach me at augustrush0923@gmail.com
Go语言基础-变量声明
发布:2021年01月11日 | 作者:augustrush | 阅读量: 712

变量的声明方法


Go 语言是静态类型语言,由于编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类型。

变量在使用前,需要先声明。声明类型,就约定了你这个变量只能赋该类型的值。

声明一般有以下四种方法,其中前面两种同样也可用于定义常量,只需把关键字 var 变成 const 即可。


第一种:一行声明一个变量

var <name> <type>

其中var是关键字(固定不变), name是变量名, type是类型。

使用var,虽然只指定了类型,但是Go会对其进行隐式初始化,比如string类型就是初始化为空字符串int类型就初始化为0,float就初始化为0,0,bool类型就初始化为false,指针类型就初始化为nil

var name string

若想在声明过程中,顺便也初始化,也可以这样写。


var name string = "August Rush"

从右值(等号右边的值,rvalue)来看,明显是个string类型(这里要注意,在Python中双引号与单引号等价,但在Go中双引号和单引号是不一样的,String类型一定要使用双引号,表示字符串。而单引号表示rune类型的字符),因此也可以将其简化为

var name = "August Rush"


若你的右值带有小数点,在不指定类型的情况下,编译器会将你的这个变量声明为float64,但是很多情况下,我们并不需要这么高的精度(占用的内存空间更大)

这种情况下,推荐指定类型,不要偷懒

var rate float32 = 0.69


第二种:多个变量一起声明

声明多个变量,除了可以按照上面写成多行之外,还可以写成下面这样

var (
    name string
    age int
    gender string
)

var (
        age    int    = 18
        gender string = "male"
    )


第三种:声明和初始化一个变量


使用:=(推导声明写法或者短类型声明发:编译器会自动根据右值类型判断出左值的对应类型。),可以声明一个变量,并对其进行(显示)初始化。

name := "August Rush"

// 等价于
var name string = "August Rush"

// 等价于
var name = "August Rush"

但是这种方法有个限制就是,只能用于函数内部


第四种:声明和初始化多个变量


name, age := "August Rush", 18

这种方法,也经常用于变量的交换

var a int = 100

var b int = 200

b, a = a, b


第五种:new函数声明一个指针变量

变量分为两种普通变量指针变量

普通变量,存放的是数据本身,而指针变量存放的是数据的地址。

package main

import "fmt"

func main() {
    var age int = 18
    var ptr = &age  // &后面接变量名,表示去除该变量的内存地址
    fmt.Println("age: ", age)
    fmt.Println("ptr: ", ptr)
}

输出

age: 18

ptr: 0xc0000bc008

而这里要说的new函数,是Go里的一个内建函数。

使用表达式new(Type)将创建一个Type类型的匿名变量,初始化为Type类型的零值,然后返回变量地址,返回的指针类型为*Type

package main

import "fmt"

func main(){
    ptr := new(int)
    fmt.Println("ptr address:" , ptr)
    fmt.Println("ptr value:" , *ptr) // *后面接指针变量, 表示从内存地址中取出值
}


输出

ptr: 0xc000014070

ptr: 0


用new创建变量和普通变量声明语句方式创建变量没有什么区别,除了不需要声明一个临时变量的名字外,我们还可以在表达式中使用new(Type)。换言之,new函数类似是一种语法糖,而不是一个新的基础概念。

如下两种写法,可以说是等价的

// 使用new
func newInt() *int {
    return new(int)
}

// 使用传统的方式
func newInt() *int {
    var dummy int
    return &dummy
}


以上不管哪种方法,变量/常量都只是声明一次,声明多次,编译就会报错。

但也有例外,这就要说到一个特殊变量:匿名变量,也称作占位符,或者空白标识符,用下划线表示。

匿名变量,有三个优点:

  • 不分配内存,不占用内存空间

  • 不需要你为命名无用的变量名而纠结

  • 多次声明不会有任何问题

通常我们用匿名接收必须接收,但是又不会用到的值。

func GetData() (int, int) {
    return 100, 200
}

func main() {
    a, _ := GetData()
    _, b := GetData()
    fmt.Println(a,b)
}


  • 标签云

  • 支付宝扫码支持一下

  • 微信扫码支持一下



基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建

京ICP备20007446号-1 & 豫公网安备 41100202000460号

网站地图 & RSS | Feed