绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
go语言学习一(2020-03-12)
2020-07-09 17:48:59

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

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

变量生命周期:变量的生命周期指的是在程序运行期间变量有效存在的时间段。对于在包一级声明的变量来说,它们的生命周期和整个程序的运行周期是一致的。而相比之下,局部变量的生命周期则是动态的:每次从创建一个新变量的声明语句开始,直到该变量不再被引用为止,然后变量的存储空间可能被回收。函数的参数变量和返回值变量都是局部变量。它们在函数每次被调用的时候创建。那么Go语言的自动垃圾收集器是如何知道一个变量是何时可以被回收的呢?这里我们可以避开完整的技术细节,基本的实现思路是,从每个包级的变量和每个当前运行函数的每一个局部变量开始,通过指针或引用的访问路径遍历,是否可以找到该变量。如果不存在这样的访问路径,那么说明该变量是不可达的,也就是说它是否存在并不会影响程序后续的计算结果。因为一个变量的有效周期只取决于是否可达,因此一个循环迭代内部的局部变量的生命周期可能超出其局部作用域。同时,局部变量可能在函数返回之后依然存在。编译器会自动选择在栈上还是在堆上分配局部变量的存储空间,但可能令人惊讶的是,这个选择并不是由用var还是new声明变量的方式决定的。
作用域:声明语句的作用域是指源代码中可以有效使用这个名字的范围。不要将作用域和生命周期混为一谈。声明语句的作用域对应的是一个源代码的文本区域;它是一个编译时的属性。一个变量的生命周期是指程序运行时变量存在的有效时间段,在此时间区域内它可以被程序的其他部分引用;是一个运行时的概念。

4. go格式化,参考:

5.数据类型
Go语言将数据类型分为四类:基础类型、复合类型、引用类型和接口类型。基础类型,包括:数字、字符串和布尔型。复合数据类型——数组和结构体——是通过组合简单类型,来表达更加复杂的数据结构。引用类型包括指针、切片、字典、函数、通道,虽然数据种类很多,但它们都是对程序中一个变量或状态的间接引用。这意味着对任一引用类型数据的修改都会影响所有该引用的拷贝。

基本数据类型,它们可以用于构建程序中数据结构,是Go语言的世界的原子。复合数据类型,它是以不同的方式组合基本类型可以构造出来的复合数据类型。Go语言中四种基本复合类型——数组、slice、map和结构体。数组和结构体是聚合类型;它们的值由许多元素或成员字段的值组成。数组是由同构的元素组成——每个数组元素都是完全相同的类型——结构体则是由异构的元素组成的。数组和结构体都是有固定内存大小的数据结构。相比之下,slice和map则是动态的数据结构,它们将根据需要动态增长。


分享好友

分享这个小栈给你的朋友们,一起进步吧。

Go语言技术精选专区
创建时间:2020-07-08 10:28:08
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • dapan
    专家
戳我,来吐槽~