《GO语言圣经》读书笔记(一)
- 2019 年 11 月 21 日
- 筆記
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wangtongxue123456/article/details/53893147
Go语言圣经(一)
程序结构
命名
Go区分大小写,Go所有命名必须遵循,一个名字必须以一个字母(Unicode 字 母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。
Go 语言程序员推荐使用 驼峰式 命名,当名字有几个单词组 成的时优先使用大小写分隔,而不是优先用下划线分隔。
关键字
Go 语言中的关键字有 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
注意 此外,GO还有大约 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
声明
Go 语言主要有四种类型的声明语句:var、const、type 和 func,分别对应变量、常 量、类型和函数实体对象的声明。
变量
Go 语言->变量声明的一般语法如下:
var 变量名字 类型 = 表达式
其中“类型”和“表达式”可以省略
- 如果省略的是类型信息,==那么将根据初始化表达式来推导变量的类型信息==。
- 如果省略的是表达式,==那么将用零值初始化该变量==。
- 数值类型变量对应的零值是==0==
- 布尔类型变量对应的是==false==
- 字符串类型对应的零值是==nil==
- 接口或引用类型包括(slice,map,chan,和函数 变量对应的零值是==nil==
- 数组或结构体等聚合类型对应的零值是每个元素或字段都是对应该类型的==零值==。
简单变量声明
==只能在函数内部==
名字 := 表达式 // 只能在函数内部
指针
一个变量对应一个保存了变量对应类型值的内存空间。一个指针的值是另一个变量的地址。一个指针对应变量在内存中的存储位置。并不是每一个值都会有一个内存地址,但是对于每一个变量必然有对应的内存地址。通过指针,我们可以直接读或更新对应变量的值,而不需要知道该变量的名字(如果变量有名字的话)。
如果用,==var x int== 声明一个x 变量,那么 &x表达式(取x变量的内存地址)将产生一个指向该整数变量的指针。该指针类型是 *int,指针被称之为,指向int类型的指针。
x := 1 p := &x // p, of 类型 *int, points to x fmt.Println(*p) // "1" *p = 2 // equivalent to x = 2 fmt.Println(x) // "2"
如果==指针名字为 p==,那么可以说 ‚==p 指针指向变量 x‛==,或者说‚==p 指针保存了 x 变量的内存地址==‛。==*同时 p 表达 式对应 p 指针指向的变量的值==。一般 * p 表达式读取指针指向的变量的值,这里 为 int 类型的值,同时因为* p 对应一个变量,所以该表达式也可以出现在赋 值语句的左边,表示更新指针所指向的变量的值。
new 函数
另一个创建变量的方法是调用用内建的 new 函数。表达式类型 new(T) 将创建一个 T 类型的匿名变量,初始化 T 类型的零值,然后返回变量地址 (注意 new 内置函数创建的变量返回的是变量的地址),返回的指针类型为 * T
p := new(int) // p, *int 类型, 指向匿名的 int 变量 fmt.Println(*p) // "0" *p = 2 // 设置 int 匿名变量的值为 2 fmt.Println(*p) // "2"
变量的声明周期
变量的生命周期指的是在程序运行期间变量有效存在的时间间隔
包一级声明的变量来说,它们的生命周期和整个程序的运行周期是一致的。 局部变量的声明周期则是动态的:从每次创建一个新变量的声明语句开始,直到该变量不再被引用为止,然后变量的存储空间可能被回收。 函数的参数变量和返回值变量都是局部变量。它们在函数每次被调用的时候创建。
类型
一个类型声明语句创建了一个新的类型名称,和现有类型具有相同的底层 结构。新命名的类型提供了一个方法,用来分隔不同概念的类型,这样即使它 们底层类型相同也是不兼容的。
type 类型名字 底层类型 //列入 type Integer int
类型转换
对于每一个类型 T,都有一个对应的类型转换操作 T(x),用于将 x 转为 T类型(译注:如果 T 是指针类型,可能会需要用小括弧包装T,比如(*int)(0)。只有当两个类型的底层基础类型相同时,才允许这种转型操作,或者是两者都是指向相同底层结构的指针类型,这些转换只改变类型而不会影响值本身。如果 x 是可以赋值给 T 类型的值,那么 x 必然也可以被转为 T 类型,但是一般没 有这个必要。
例如
type Integer int var i Integer var o int=9 i=Integer(o) fmt.Print(i) // 9
作用域
一个声明语句将程序中的实体和一个名字关联,比如一个函数或一个变 量。==声明语句的作用域是指源代码中可以有效使用这个名字的范围==。
作用域和生命周期的区别
- 作用域
不要将作用域和生命周期混为一谈。声明语句的作用域对应的是一个源代 码的文本区域;它是一个编译时的属性。 生命周期 一个变量的生命周期是指程序运行时 变量存在的有效时间段,在此时间区域内它可以被程序的其他部分引用;是一 个运行时的概念。
包
Go 语言中的包和其他语言的库或模块的概念类似,目的都是为了支持模 块化、封装、单独编译和代码重用。一个包的源代码保存在一个或多个以.go 为文件后缀名的源文件中,通常一个包所在目录路径的后缀是包的导入路径; 例如包 gopl.io/ch1/helloworld 对应的目录路径是 $GOPATH/src/gopl.io/ch1/helloworld。
注意
java可以以一个类为整体,在go语言中一定要以一个包为一个整体,而不是.go文件。 GO语言包下同一个作用域下不能出现相同的变量名和函数。