Go语言自学十八式:变量创建篇

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

变量声明之后才可以使用 。

声明变量(关键字 var)一般有以下五种方法,其中前两种同样也可用于定义常量(关键字 const

一:一行声明一个变量

var <name> <type>

其中 var 是声明变量关键字,name 是变量名,type 是类型。

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

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

var name string = "Edemao 博客"

在 Go 文件中的完整代码如下,为了不写重复性的代码,后续只展示关键代码:

package main

import "fmt"

func main() {
    var name string = "Edemao 博客"
    fmt.Println(name)
}

在 Go 中一定要使用双引号,表示字符串,而在单引号表示rune 类型的字符,因此也可以将其简化为:

 var name = "Edemao 博客"

若右值带有小数点,在不指定类型的情况下,编译器会将你的这个变量声明为 float64,在精度要求不高情况下考虑内存空间,推荐指定类型:

var rate float32 = 0.89

二:多个变量一起声明

声明多个变量,一是可以按照第一种方法写成多行,此外还可以使用小括号:

var (
    name string
    age int
    sex string
)

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

使用 := (推导声明写法或短类型声明法),编译器会自动根据右值类型推断出左值的对应类型。对变量进行声明和(显式)初始化:

name := "Edemao 博客"

// 等价于
var name string = "Edemao 博客"

// 等价于
var name = "Edemao 博客"

此方法只能用于函数内部

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

name, age := "Edemao 博客", 24
//同时支持变量交换
var a int = 100
var b int = 200
b, a = a, b

五:new 函数创建指针变量

变量分为两种 普通变量 和 指针变量。其中普通变量,存放的是数据本身,而指针变量存放的是数据的地址。比如:

//age 是一个普通变量,存放的内容是24,而 ptr 是 存放变量age值的内存地址:0xc000010098
package main

import "fmt"

func main() {
    var age int = 24
    var ptr = &age  // &后面接变量名,表示取出该变量的内存地址
    fmt.Println("age: ", age)
    fmt.Println("ptr: ", ptr)
}
/*输出
age:  28
ptr:  0xc000010098
*/

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 address:  0xc000010098
ptr value:  0
*/

用new创建变量和普通变量声明语句方式创建变量其实无区别,只是可以不需要声明一个临时变量的名字和可以在表达式中使用new(Type)。简言之,new函数类似语法糖。以下两种方式等价:

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

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

对于Go语言,变量/常量都只能声明一次,声明多次,编译就会报错。

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

匿名变量,优点有三:

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

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

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

通常我们用匿名变量来接收必须接收,但是又不会用到的值,就像这样:

func getData() (int, int) {
    return 100, 200
}
func main(){
    a, _ := getData()
    _, b := getData()
    fmt.Println(a, b)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫96

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值