[Go]程序结构-声明

引言:该系列笔记,是本人自学Go过程中整理的笔记,供大家参考。


Go语言的声明主要由四种:var、const、type、func,分别对应声明变量、常量、类型、函数实体对象。

变量

通常声明一个变量的一般语法如下:

var 变量名字 类型 = 表达式

其中类型和“= 表达式”都可以省略,如果省略的是类型,那么会根据表达式的赋值来判断变量所属的类型。如果省略的是“= 表达式”,那么会初始化一个定义该类型的变量,它的值为该类型的零值(zero value),比如如果是int类型,那么初始化的值为0,是string类型,那么初始化的值是"",布尔类型变量对应的零值是false,接口或引用类型(包括slice、指针、map、chan和函数)变量对应的零值是nil,数组或结构体等聚合类型对应的零值是每个元素或字段都是对应该类型的零值。

可以同时声明一组变量,也可以同时声明不同类型的变量:

var a, b, c int  
var b, f, s = true, 13.3, "yes" // Boolean、float、string

一组变量也可以通过调用一个函数,由函数返回的多个值初始化:

var f, err = os.Open(file_name) // 这个函数返回一个文件和一个错误

简短声明变量
  • 常用在函数内部,形式为: 名字 := 表达式,同样的简短声明变量也支持同时声明一组变量。简短声明变量旨在提高代码可读性,比如说for循环中初始化语句部分。
  • 简短声明变量是 :=,赋值是 =,要注意区分。
  • 简短声明变量左边的变量并不一定全部都是首次声明的,也有一些变量在此之前已经声明过(在同级词法域),如果此前声明过了,再次声明的效果等同于赋值。但是,简短声明要求每次声明左边的变量都必须包含一个首次声明的变量,否则无法通过编译。如果变量首次在外部词法域声明过,在内部词法域重新声明不等于赋值操作。
指针

一个指针的值是另一个变量的地址。一个指针对应变量在内存中的存储位置。并不是每一个值都会有一个内存地址,但是对于每一个变量必然有对应的内存地址。通过指针,我们可以直接读或者更新对应变量的值,而不需要知道变量的名字。

如果声明一个变量如下:

var a int

*int是指针对应的数据类型,这里指针的数据类型是int

p := &a是创建一个指向该整数变量的指针,指针的名字为p

*a代表指针指向该整数变量的值

  • 任何类型的指针的零值都是nil,只有当指针指向同一个值或者全是nil时指针才会相等
var x, y int  
fmt.Println(&x == &x, &x == &y, &x == nil) // true, false, false
var x, y int
fmt.Println(&x == &x, &x == &y, &x == nil) // true, false, false
  • 指针特别有价值的地方在于我们可以不用名字而访问一个变量
  • 每次我们对一个变量取地址,或者复制指针,我们都是为原变量创建了新的别名.
new函数

将创建一个T类型的匿名变量,它的初始值为T类型的零值。然后返回变量地址,返回指针类型*T

p := new(int)  

fmt.Println(*p) // 0  

*p = 2  

fmt.Println(*p) // 2
p := new(int)  

fmt.Println(*p) // 0  

*p = 2  

fmt.Println(*p) // 2

每次调用new函数都是返回一个新的变量的地址

p := new(int)  
q := new(int)  
fmt.Printlb(*p == *q) // false

下面两个函数实现的功能是一样的,new函数更像是一种语法糖

func newInt() *int {  

  return new(int)  

}  

func newInt() *int {  

  var dummy int  

  return &dummy  

}
func newInt() *int {
    return new(int)
}

func newInt() *int {
    var dummy int
    return &dummy
}
var、make、new的区别

varmakenew都是Go语言中用来创建变量或对象的关键字,但它们的作用和用法是不同的。

  1. var关键字用于声明变量,可以用于声明任何类型的变量,包括基本类型、结构体、数组、切片、map等。例如:
var x int
var s []string
var m map[string]int

在这个例子中,我们使用var关键字声明了一个整型变量x,一个字符串切片s和一个字符串到整型的映射m
2. `make函数用于创建切片、map和channel等引用类型的对象。例如:

s := make([]string, 10)
m := make[string]int)
ch := make(chan int)

在这个例子中,我们使用make函数创建了一个长度为10的字符串切片s,一个字符串到整型的映射m和一个整型channelch
3. new函数用于创建一个指向某种类型的指针,返回的是指针类型。例如:

p := new(int)

在这个例子中,我们使用new函数创建了一个指向整型的指针p

总的来说,var用于声明变量,make用于创建引用类型的对象,new用于创建指向某种类型的指针。需要注意的是,makenew都是用于动态分配内存的,而var只是声明变量,不会分配内存。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值