名称
Go 语言中所有的函数、变量、常量、类型、语句和包名称都遵循一个简单的规则,即名称的开头是一个字母(Unicode即可)或下划线,后面可跟任意数量的字符、数字和下划线。注意 Go 对所有名称的大小写都敏感的。当然总有例外,那就是下面的这些名称。
Go 关键字 | ||||
---|---|---|---|---|
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 关键字,Go为这些关键字保留了使用权力,你无权使用。
内置函数 : append
, cap
, close
, len
, make
, new
, copy
, delete
complex
, real
, imag
panic
,recover
内置类型:complex64
, complex128
,float32
, float64
, int
, int8
, int16
, int32
, int64
, int128
, unit
,unit8
,uint16
, uint32
, uint128
, bool
, byte
, string
, rune
, error
内置常量: true
,false
, iota
,nil
Go 中 几十个内置预声明的常量、类型和函数名称用于特定用途,除非你知道你在干什么,否则不要随意命令上面的名称。
名称本身并没有好坏之分,只要清楚用途即可,如果将 x1 = 温度值, x2 = 湿度值, x3 = 照度值,也是可以,但是你要时刻记得他们谁是谁,否则你就最好使命名有意义。Go喜欢驼峰式名称,用于区别不同单词或动作,如GetNumber(),但对于约定简写,全部大写可能会更好一些。
声明变量、常量及类型
声明就是给一段程序或变量一个名字,使其容易区别、引用和查找。声明可以声明包、函数、类型、变量和常量,包和函数的声明后文再说。
在同一作用域内(什么是作用域,后面一点再谈,暂时可以理解为一个文件范围,或一个{}
体内),声明的变量或常量或其他是不分前后顺序的,但声明不能在调用后发生,否则不能称其为声明。包级别声明,在全包范围内可见,局部声明则仅在局部范围可见。
变量
var 声明创建一个具体类型的变量,然后给它附加一个名字,设置初始值,如果没有初始值,那么 Go 会给它默认初值,在 Go 中,只要声明的变量调用就是安全的,全为其类型的“零”值。
var varname type = express
var height int = 20 // 声明一个身高变量,并赋给初值 20
var age int = 20 // 声明一个年龄变量,不赋给初值,Go 默认初始化为0
也可以进行多个变量的一起声明
var i, j, k float32 声明一组坐标的变量
var i, j, k float32 = 1.0 2.0 3.0 声明一组坐标,并同时初始化
当然声明的是基本类型,可以利用 Go 的类型推断,省略变量类型
var i, j, k = 1.0, 2.0, 3.0 #
上述表达也是 ok 的,Go 会利用右端的值推断左端变量的类型,但是由于 数值上 1.0 == 1, 如果你略去 float32,i, j, k 也可能推断为 int 类型,对于计算造成一定不可见问题。但对于没有歧义的地方,例如字符串string
,则是一种偷懒的好办法。
var i, j, k = 1, 2, 3
fmt.Printf("i / j = %f, i / k = %f \n", float32(i/j), float32(i/k))
var x, y, z = 1.0, 2.0, 3.0
fmt.Printf("x / y = %f, x / z = %f \n", float32(x/y), float32(x/z))
/*
i / j = 0.000000, i / k = 0.000000
x / y = 0.500000, x / z = 0.333333
*/
想在同一行语句中声明不同的变量,也可以,可以声明如下格式。也可以通过返回值类型确定变量类型。
var (
name = "Jack"
age int = 20
height float32 = 1.8
)
var f, err = os.Open("HelloWorld.go")
如前所说,Go 还有一种短变量声明,这种声明方式一般都都带有初始化(即利用自动推断初始化变量,否则 Go 不知道变量类型,没有办法分配变量空间)
name, age, height := "Jack", 20, 1.80
freq = rand.Float64() * 3.0
f, err := os.Open("HelloWorld.go")
// 错误的一种 f, err = os.Open("HelloWorld.go"),既没有前面加关键字 var 也没有利用简短声明标识 := ,
那么就是未声明就直接赋值,什么后果……,后果就是编译不通过,提示未定义的变量,然后再去补上喽。
只要有未声明的变量,就应该使用 :=
声明。已经声明的变量,赋值的时候就必须按照声明的类型去赋值,否则一定会提示出错,除非……没有除非。
一个包级别的全局变量存在于程序的整个声明周期,一个局部变量,一般在执行该局部时生成,该局部运行结束,则消亡;特殊的。当有其他变量引用到该变量时,则该变量存活。
变量声明初始化之后,赋值就是利用 =
进行了,例如刚刚的 name = "Xiaoming", age = 12, height = 1.3
,也可以进行多重赋值,如 name, age, height = "Xiaoming, 12, 1.3"
但必须保证等号两端个数一样多,类型相同。相比于 C 语言交换两个数的考验,这种特性保证可以交换成功,x, y = y, x
常量
常量是什么,常量一旦声明就不能变量的量,所以常量必须在编译时是确定下来。除此以外,常量和变量就几乎没有区别了,除了常量使用的是 const
来声明,而变量使用 var
来声明,其他模式均一致。
const pi = 3.14159265358979323846 // 我只会背到这里了
const (
a = 1 + 1
b // b会默认使用a的类型及值
c = 2
)
类型
类型的声明,是通过 type 进行的,声明的新类型和某一个已有类型使用相同的底层类型。
type name underlying-type
为什么底层相同,上层要不一样呢,其实是为了怕混淆不同类型的数据。例如,1 RMB 和 1 USD 两者数值相等,等所拥有的价值完全不一样,为了不让他们混淆,那么就需要将两者区别开。
type RMB int
type USD int
var mywallet RMB = 20
var yourwallet USD = 20
fmt.Println(mywallet == youwallet)
// 编译失败,两种类型底层相同,但不能直接比较,想要比较必须进行显式的转换
//例如,func RMB2USD(yuan RMB) USD { return USD(6*yuan)}
// 我不清楚今天汇率,麻烦自己查一下
网友评论