go语言学习一(2020-03-12)

2020-07-09 00:00:00 函数 语言 变量 类型 声明

一、编程语言考虑几个方面:

1.运行效率

2.开发效率

3.工程规范

4.解决痛点即核心特性(goroutine->并发、channel ->通信)

5.项目工具链(自动化构建、自动化部署、自动化运维)

6.相关库与生态


1. go语言包机制(package && import),参考:
二、go语言注意点

入坑Go语言(二)—— 包机制的理解www.jianshu.com

2. go语言命名,在习惯上,Go语言程序员推荐使用驼峰式命名,当名字由几个单词组成时优先使用大小写分隔,而不是优先用下划线分隔;Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。大写字母和小写字母是不同的。

《go语言圣经》命名片段

3. go语言声明,声明语句定义了程序的各种实体对象以及部分或全部的属性。Go语言主要有四种类型的声明语句:var、const、type和func,分别对应变量、常量、类型和函数实体对象的声明。
(1)一个函数的声明由一个函数名字、参数列表(由函数的调用者提供参数变量的具体值)、一个可选的返回值列表和包含函数定义的函数体组成。如果函数没有返回值,那么返回值列表是省略的。执行函数从函数的个语句开始,依次顺序执行直到遇到return返回语句,如果没有返回语句则是执行到函数末尾,然后返回到函数调用者;

(2)var声明语句可以创建一个特定类型的变量,然后给变量附加一个名字,并且设置变量的初始值,语法即:var 变量名字 类型 = 表达式。其中“类型”或“= 表达式”两个部分可以省略其中的一个。如果省略的是类型信息,那么将根据初始化表达式来推导变量的类型信息。如果初始化表达式被省略,那么将用零值初始化该变量。 数值类型变量对应的零值是0,布尔类型变量对应的零值是false,字符串类型对应的零值是空字符串,接口或引用类型(包括slice、指针、map、chan和函数)变量对应的零值是nil。数组或结构体等聚合类型对应的零值是每个元素或字段都是对应该类型的零值。
零值初始化机制可以确保每个声明的变量总是有一个良好定义的值,因此在Go语言中不存在未初始化的变量。这个特性可以简化很多代码,而且可以在没有增加额外工作的前提下确保边界条件下的合理行为。
在函数内部,有一种称为简短变量声明语句的形式可用于声明和初始化局部变量。它以“名字 := 表达式”形式声明变量,变量的类型根据表达式来自动推导。因为简洁和灵活的特点,简短变量声明被广泛用于大部分的局部变量的声明和初始化。var形式的声明语句往往是用于需要显式指定变量类型的地方,或者因为变量稍后会被重新赋值而初始值无关紧要的地方。

一个变量对应一个保存了变量对应类型值的内存空间 ,一个指针的值是另一个变量的地址。一个指针对应变量在内存中的存储位置。并不是每一个值都会有一个内存地址,但是对于每一个变量必然有对应的内存地址。通过指针,我们可以直接读或更新对应变量的值,而不需要知道该变量的名字(如果变量有名字的话)。任何类型的指针的零值都是nil。另一个创建变量的方法是调用内建的new函数。表达式new(T)将创建一个T类型的匿名变量,初始化为T类型的零值,然后返回变量地址,返回的指针类型为*T

变量 vs 指针:指针是一种特殊的变量, 它的值是另一个变量对应的内存空间的地址;变量的地址是其值对应的内存空间的地址,但并不是每个值对应有一个内存地址。个人觉得可以理解为:变量标识符是内存地址的别名,因为内存地址不好称呼和记忆,所以就有了变量标识符,变量名或者变量标识符本身存在方便称呼和记忆的优点,认为赋予丰富实际的上下文意义;每个内存地址(一维连续空间表示)也可以打个比方理解为房间号或者格子号,每个房间或者格子里存放的内容就是变量的值,也就是内存地址指向存储的内容,所以可以将变量标识符理解为内存地址。因此,指针本身也是内存地址的别名,也就是一种特殊变量,其指向的房间或者格子内容只不过一种特殊的值而已,即是另一段内存的地址或者另一个变量对应的地址, 也可以理解为指针是其指向变量的别名。证明如下图:

test: 
 x := 1
 fmt.Printf("%d\n%p\n%T\n\n", x, &x, x)
 y := &x
 fmt.Printf("%d\n%p\n%p\n%T\n\n", *y, y, &y, y)

output:
1
0xc420088028
int

1
0xc420088028
0xc420096020
*int

相关文章