2.1 命名
1) 一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。
大写字母和小写字母是不同的。

2) 关键字有25个;关键字不能用于自定义名字,只能在特定语法结构中使用。
break      default       func     interface   select
case       defer         go       map         struct
chan       else          goto     package     switch
const      fallthrough   if       range       type
continue   for           import   return      var

3) 还有大约30多个预定义的名字,比如int和true等,主要对应内建的常量、类型和函数。
内建常量: true false iota nil

内建类型: int int8 int16 int32 int64
          uint uint8 uint16 uint32 uint64 uintptr
          float32 float64 complex128 complex64
          bool byte rune string error

内建函数: make len cap new append copy close delete
          complex real imag
          panic recover
这些内部预先定义的名字并不是关键字,你可以再定义中重新使用它们。

4) 惯性用法
如果一个名字是大写字母开头的,那么它将是导出的,也就是说可以被外部的包访问。
包本身的名字一般总是用小写字母。
尽量使用短小的名字。
推荐使用"驼峰式"命名。
像ASCII和HTML这样的缩略词则避免使用大小写混合的写法,它们可能被称为htmlEscape、HTMLEscape或escapeHTML,但不会是escapeHtml。

2.2 声明
1) 四种类型的声明语句:var、const、type和func,分别对应变量、常量、类型和函数实体对象的声明。

2) 每个源文件基本组成
以包的声明语句开始,说明该源文件是属于哪个包。
包声明语句之后是import语句导入依赖的其它包,然后是包一级的类型、变量、常量、函数的声明语句。

3) 包一级的各种类型、变量、常量、函数的声明语句的顺序无关紧要

2.3 变量
1) 变量声明格式
var 变量名字 类型 = 表达式
可以省略类型或表达式之一。省略类型,则根据表达式推导类型;省略表达式,则初始化为对应类型的0值。
类型的零值
数值类型 0
布尔类型 false
字符串类型 空字符串
接口或引用类型(包括slice、map、chan和函数) nil
数组或结构体等聚合类型 每个元素或字段都是对应该类型的零值。

同时声明多个变量
var i, j, k int                 // int, int, int
var b, f, s = true, 2.3, "four" // bool, float64, string

2) 在包级别声明的变量会在main入口函数执行前完成初始化

3) 简短变量声明
只能用于函数中
i := 100                  // an int

可以初始化一组变量,一般用于提高代码可读性,如for、if的初始化条件。
i, j := 0, 1

简短变量声明语句中,左边变量必须至少要声明一个新的变量,不然无法通过编译。
对已经声明过的变量,如果是在相同词法域,则赋值;如果是上级词法域,则会生成一个新的覆盖上级变量,这可能会引起奇怪的bug

4) 指针
一个指针对应变量在内存中的存储位置。并不是每一个值都会有一个内存地址,但是对于每一个变量必然有对应的内存地址。

&x表达式(取x变量的内存地址)

任何类型的指针的零值都是nil。指针之间可以进行相等测试,只有当它们指向同一个变量或全部是nil时才相等。

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

6) 大小为0的变量
struct{} 或 [0]int64 
请谨慎使用大小为0的类型,因为如果类型的大小位0好话,可能导致Go语言的自动垃圾回收器有不同的行为,具体请查看runtime.SetFinalizer函数相关文档

7) 变量生命周期
对于在包一级声明的变量来说,它们的生命周期和整个程序的运行周期是一致的。而局部变量的声明周期则是动态的:从每次创建一个新变量的声明语句开始,直到该变量不再被引用为止。

8) 变量内存分配
编译器会自动选择在栈上还是在堆上分配局部变量的存储空间,但这个选择并不是由用var还是new声明变量的方式决定的。

2.4 赋值
1) 元组赋值
允许同时更新多个变量的值。在赋值之前,赋值语句右边的所有表达式将会先进行求值,然后再统一更新左边对应变量的值。
交换变量
x, y = y, x
a[i], a[j] = a[j], a[i]
f, err = os.Open("foo.txt") // 需要确保函数返回值和左边变量数目一致

v, ok = m[key]             // map lookup
v, ok = x.(T)              // type assertion
v, ok = <-ch               // channel receive

对于值产生一个结果的情形,map查找失败时会返回零值,类型断言失败时会发送运行时panic异常,通道接收失败时会返回零值(阻塞不算是失败)。

2.5 类型
1) 一个类型声明语句创建了一个新的类型名称,和现有类型具有相同的底层结构。
type 类型名字 底层类型
type Celsius float64    // 摄氏温度
type Fahrenheit float64 // 华氏温度

底层数据类型决定了内部结构和表达方式,也决定是否可以像底层类型一样对内置运算符的支持。Celsius和Fahrenheit类型的算术运算行为和底层的float64类型是一样的。

2) 类型转换
对于每一个类型T,都有一个对应的类型转换操作T(x)。
只有当两个类型的底层基础类型相同时,才允许转型操作,或者是两者都是指向相同底层结构的指针类型,这些转换只改变类型而不会影响值本身。

3) 对于中文汉字,Unicode标志都作为小写字母处理,因此中文的命名默认不能导出;

2.6 包
1) 按照惯例,一个包的名字和包的导入路径的最后一个字段相同

2) 包注释
在每个源文件的包声明前仅跟着的注释是包注释。
通常,包注释的第一句应该先是包的功能概要说明。
一个包通常只有一个源文件有包注释。
如果有多个包注释,目前的文档工具会根据源文件名的先后顺序将它们链接为一个包注释。
如果包注释很大,通常会放到一个独立的doc.go文件中。

3) 包的初始化
如果包中含有多个.go源文件,它们将按照发给编译器的顺序进行初始化,Go语言的构建工具首先会将.go文件根据文件名排序,然后依次调用编译器编译。

每个文件都可以包含多个init初始化函数,这样的init初始化函数除了不能被调用或引用外,其他行为和普通函数类似。
在每个文件中的init初始化函数,在程序开始执行时按照它们声明的顺序被自动调用。

每个包在解决依赖的前提下,以导入声明的顺序初始化,每个包只会被初始化一次。
初始化工作是自下而上进行的,main包最后被初始化。以这种方式,可以确保在main函数执行之前,所有依然的包都已经完成初始化工作了。

2.7 作用域
1) 声明语句的作用域是指源代码中可以有效使用这个名字的范围。

2) 控制流标号,就是break、continue或goto语句后面跟着的那种标号,则是函数级的作用域。

3) 如果一个变量或常量递归引用了自身,则会产生编译错误。函数和类型则不会。

4) Go语言的习惯是在if中处理错误然后直接返回,这样可以确保正常执行的语句不需要代码缩进。

go圣经笔记--第二章相关推荐

  1. 《Go语言圣经》学习笔记 第二章 程序结构

    Go语言圣经学习笔记 第二章 程序结构 目录 命名 声明 变量 赋值 类型 包和文件 作用域 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记,几乎是书上的内 ...

  2. 深入理解 C 指针阅读笔记 -- 第二章

    Chapter2.h #ifndef __CHAPTER_2_ #define __CHAPTER_2_/*<深入理解C指针>学习笔记 -- 第二章*//*内存泄露的两种形式1.忘记回收内 ...

  3. Web前端开发笔记——第二章 HTML语言 第四节 超链接标签

    目录 前言 一.超链接标签 (一)链接其它子网页 (二)链接其它站点 (三)虚拟超链接 二.从当前页面链接到指定位置 三.链接的访问情况 四.在新窗口中打开链接 例题 结语 前言 本节介绍超链接标签即 ...

  4. 《计算传播学导论》读书笔记——第二章文本分析简介

    <计算传播学导论>读书笔记--第二章文本分析简介 第一节 文本分析研究现状 常用文本挖掘技术 第二节 文本分析与传播学研究 (一)为什么文本挖掘技术逐渐受到传播学者的关注 (二)不同文本分 ...

  5. Computational Optimal Transport 笔记——第二章(2)

    Computational Optimal Transport 笔记--第二章(2) 符号说明 2. 理论基础 2.3 Kantorovich Relaxation SUM 2.4 Optimal T ...

  6. PhalAPI学习笔记 ——— 第二章接口服务请求

    PhalAPI学习笔记 --- 第二章接口服务请求 前言 接口服务请求 接口服务请求案例 自定义接口路由 开启匹配路由 配置路由规则 nginx apache 服务请求 结束语 前言 公司业务需要转学 ...

  7. 操作系统笔记 第二章

    操作系统笔记 第二章 1.有两个程序:A程序按顺序使用CPU10秒.设备甲5秒.CPU5秒.设备乙10秒.CPU10秒:B程序按顺序使用设备甲10秒.CPU 10秒.CPU5秒.设备乙5秒.CPU 5 ...

  8. JavaSE入门0基础笔记 第二章Java基础语法

    JavaSE入门0基础笔记 第二章Java基础语法 1.运算符 1.1算术运算符 1.1.1运算符和表达式 1.1.2 算术运算符 1.1.3字符的"+"操作 1.1.4 字符串中 ...

  9. 【王道考研】操作系统 笔记 第二章上 进程调度

    本文内容,1.进程和线程 2.进程调度 特此鸣谢王道考研 本文参考王道考研的相关课程 若有侵权请联系,立删 其余笔记链接: [王道考研]操作系统笔记 第一章_才疏学浅743的博客-CSDN博客 [王道 ...

最新文章

  1. 生物信息学 生物科学、农学、林学、医学
  2. Linux socket学习
  3. 只有程序员才有的十大烦恼
  4. 机器学习:SVM算法的对偶形式
  5. G6 图可视化引擎——入门教程——插件与工具
  6. Centos7静态ip设置(亲测有效)
  7. 《C++ Primer 5th》笔记(2 / 19):变量和基本类型
  8. boot jndi数据源 spring_使用Spring Boot配置JNDI数据源 -Roy教程
  9. python怎么读取图片文件大小_python怎么读取图片大小
  10. mysql grant 用户权限
  11. android 开机动画,修改安卓开机动画(除了部分系统 如MIUI等)
  12. 《伪化生:修罗战场》写给那些在读伪化生专业的
  13. python绘制网格地图_「GIS教程」Python-GeoPandas地图、专题地图绘制
  14. RBM算法模型应用在推荐系统 Python代码实现
  15. latex安装后运行报错:系统找不到指定的文件,试试这样吧
  16. 初学者如何学好编程?
  17. postman打不开的解决办法
  18. vm 虚拟服务器 文件上传,vmware虚拟机怎么和主机之间互传文件?
  19. 10款最佳的Linux文件比较工具
  20. 蓝桥杯倒计时 | 倒计时10天

热门文章

  1. 全国计算机等级一级photoshop证书,全国计算机等级考试一级Photoshop考试大纲
  2. 管理员工绩效的 7 个最佳策略
  3. 实时数据库学习(1)
  4. 探究2020版《网上银行系统信息安全通用规范》的新变化
  5. 仿王者荣耀对战资料选项中的【雷达网图展示详细数据】
  6. “什么编程课?不重要!等以后再学吧!”
  7. oracle10创建实例表空间,解析oracle 10g示例方案创建过程
  8. python读写hdfs文件的实用解决方案
  9. Android APP Camera2应用(03)拍照保存照片流程
  10. 动规(15)-最低通行费