2.1命名:以下划线或者是Unicode字母开头命名,注意:在Go中命名区分大小写;
2.2声明:
(1)在Go中主要有四种声明,①var:变量;②func:函数实体;③const:常量;④type:类型。
(2)一级声明在整个包内都是有效的,函数内声明只在函数体有有效,任何实体或者对象函数必须先声明后使用。
2.3变量:
var声明一个特点个的变量(格式: var 变量名称 变量类型 = 表达式)其中变量类型和表达式可省略,若省略表达式,则默认值为零值(数值类变量默认为0,Boolean变量默认为false,聚合类型对应每个值为零值,借口或者引用类型定义为nil)
2.31简短变量声明,简短变量声明因为其简短灵活的特点被大量的用于局部变量的声明(变量 := 表达式),而var常常用来声明需要显式指定变量类型的地方,或者因为变量会被重新赋值而无关紧要的地方。简短变量声明中必须至少有一个变量被声明,否则不予通过。
2.32一个指针的值是另一个变量的地址,一个指针对应变量在内存中的存储位置,但是并不是任何一个值都对应一个地址,但对应一个变量必有i内存地址。任何指正的零值都是nil,地址在函数中返回任然是有效的。
(找到变量的所有访问者,这就是Go语言的垃圾回收工作)
2.34另一个创建变量的方法是调用内敛函数new函数(n := new (int)),返回一个地址,初始化T为零值。同普通的变量声明并没有太大的区别。
2.35变量的生存周期,一级声明变量跟函数的生命周期是相同的,局部变量的生命周期则是动态的,从每一次创建变量开始到不再引用为止,然后变量的存储空间才可能被回收。
2.4赋值 =
2.41元组赋值 允许同时更新多个变量的值。
2.5类型: type 类型名字 底层类型
变量或表达式的类型定义了对应存储值的属性特征,例如数值在内存的存储大小(或者是元素的bit个数),它们在内部是如何表达的,是否支持一些操作符,以及它们自己关联的方法
类型声明语句一般出现在包一级,因此如果新创建的类型名字的首字符大写,则在外部包也可以使用。
连个变量不同的类型定义,可能具有相同的底层类型,但是属于不同的类型。
package tempconv
import "fmt"
type Celsius float64 // 摄氏温度
type Fahrenheit float64 // 华氏温度
const (
AbsoluteZeroC Celsius = -273.15 // 绝对零度
FreezingC Celsius = 0 // 结冰点温度
BoilingC Celsius = 100 // 沸水温度
)
func CToF(c Celsius) Fahrenheit { return Fahrenheit(c*9/5 + 32) }
func FToC(f Fahrenheit) Celsius { return Celsius((f - 32) * 5 / 9) }
在上述的函数中,c f底层类型都是float64,但是两者之间不能进行运算操作。
2.5包和文件:
都是为了模块化、封装、单独编译和代码重用。
在Go语言中,一个方法如果开头字母为大写的则为可导出的,反之则不可导出。
2.7导入包
除了包的导入路径,每个包还有一个包名,包名一般是短小的名字(并不要求包名是唯一的),包名在包的声明处指定。
package main
import (
"fmt"
"os"
"strconv"
"gopl.io/ch2/tempconv"
)
func main() {
for _, arg := range os.Args[1:] {
t, err := strconv.ParseFloat(arg, 64)
if err != nil {
fmt.Fprintf(os.Stderr, "cf: %v\n", err)
os.Exit(1)
}
f := tempconv.Fahrenheit(t)
c := tempconv.Celsius(t)
fmt.Printf("%s = %s, %s = %s\n",
f, tempconv.FToC(f), c, tempconv.CToF(c))
}
}
2.7作用域:
不要将作用域和生命周期混淆,作用域是程序的编译属性,而生命周期则是程序运行期间该字段存在的时间。
①函数局部内部声明可以屏蔽外部声明;