go 规范
文件名小写,多单词使用下划线进行分隔,切不包含特特殊字符。
Go 语言也是区分大小写的
有效的标识符必须以字符(任何 UTF-8 字符或_),不可以是数字开头、关键字或存在运算符
_本身就是一个特殊的标识符,被称为空白标识符.
go关键词
break | default | func | interface |
case | defer | go | map |
chan | else | goto | package |
const | fallthrough | if | range |
continue | for | import | return |
go预定义标识符
append | bool | byte | cap | close | complex |
copy | false | float32 | float64 | imag | int |
int32 | int64 | iota | len | make | new |
| println | real | recover | string | true |
Go程序组成
程序一般由关键字、常量(const)、变量(var)、运算符、类型(type)和函数(func)组成
Go 分隔符
(),[],{}
Go特殊标点
.
,
; 用于表示一个语句的结束,go中一般一行为一个语句,编译器会自动加上分号,不推荐使用
:
...
Go的结构和要素
三个部分:包的申明、包的导入、函数主体,每一个go的应用程序都应该包括一个main函数。
在go中,每一个源文件属于且仅属于一个包,一个包中可以包括多个go的源文件。
注:
包名要小写。
包名冲突问题可以使用别名解决 ======== import 别名 包名
导入包不适用会报错
使用import导入所需要的包, import ("包名";...),
包名以"./"开头,则会在相对路径下寻找
包名以"/"开头,则会在系统的绝对路径下寻找
包名不以上述两种开头,则会在全局文件下寻找
Go的可见性规则
当标识符以大写字母开头则可见,小写则包外不可见.
注
常量、变量、函数、类别在包中都是可见的。
Go的标准库(待续)
位于go的根目录下的pkg目录下的某个目录。
Go类型
基本类型: int float bool string byte(int8的别名,可用于表示字符)
结构化: struct array slice map channel
描述行为: interface
注:
结构化的类型没有真正的值,它使用 nil 作为默认值。类似于java中null
go语言不存在继承
使用type可以自定义类型,也可以为已存在的类型起别名
类型转换:
类型B变量 = 类型B(类型A的变量)
数据精度的丢失
非法转换会引发编译错误
具有相同底层类型的变量之间可以相互转换
若是计算值得花,计算的值必须在编译期间就能获得
Go常量
const 变量名 变量类型 = 值, 变量类型可以省略
注
常量的值必须是能够在编译时就能够确定的
数字型的常量是没有大小和符号的,并且可以使用任何精度而不会导致溢出
反斜杠可以作为常量的多行的连接符使用
iota 很有意思,百度
Go变量
var 变量名 类型 = 值
注
赋值的操作可以省略,省略的话则会赋默认值(0,0.0,false,"", nil等)
变量的命名规则遵循骆驼命名法
但如果你的全局变量希望能够被外部包所使用,则需要将首个单词的首字母也大写
变量具有作用域
同一作用域下的变量名要唯一
一般相同的变量可以相互赋值
:=用作局部变量的初始化,=用于全局变量的初始化
&变量名可以获得变量的地址
值类型的变量的值存储在栈中
值变量与值变量间的赋值本质是值的复制
引用类型的变量存储的是变量的值所在的内存地址或内存地址中第一个字所在的位置
引用变量与引用变量间的赋值本质是指针的赋值
变量不被使用编译会报错
多个变量可以在同一行申明、赋值,逗号分隔
值得交换: a,b = b,a
空白标识符_用于值的抛弃
变量的值可以在全局中赋值,也可以在init中赋值
Go运算
值的比较
==、!= 返回值是bool,
Go 对于值之间的比较有非常严格的限制,只有两个类型相同的值才可以进行比较
bool运算
&&、 ||、 !
数值运算
变量间的运算实在同类型中的,不可混用,常量则没有限制,如果要,则要进行显示的转换
位运算自能是整形之间的,
一元:^(按位补足)、<<、>>
二元:&、|、^(异或)、&^(位清除)
变量间的运算不会改变其类型
++、--于java不同,只能用于后缀,不能前缀,也不能作为表达式
运算符优先级
优先级 运算符 7 ^ ! 6 * / % << >> & &^ 5 + - | ^ 4 == != < <= >= > 3 <- 2 && 1 ||
字符串相关
转义字符
反引号包裹的字符:显示字符
字符串的逻辑运算是基于内存的进行 的
str[i]可以获得str的第i+1个字符
不可以对str[i]取址
工具包: strings,strconv
Go 时间处理
使用time包处理,具体看API
GO 指针
例子:var ptr *数据类型 申明了一个指针,此时的指针的职位nil
取址 & var ptr *int = &i 其中 i是int类型的变量
对于任何变量 i = *(&i)总是正确的
常量和字面量的地址是无法获取的
不存在指针的运算
go的控制结构
if-else、switch、select、for(range),return, goto, break,continue来控制结构
if,for,switch是无需加括号的
if-else
基本结构:else,else if可以省略
if condition {
}else if condition{
}else{
}
switch
switch var1 { case val1: ... case val2: ... default: ...}
for
for 初始化语句; 条件语句; 修饰语句{
...
}
都可以省略,都省略的话就是无限循环
for i:=0; i < 5; i++{
...
}
for - range 结构:
for index, item := range Items {
...
}
index 代表索引, item是items中的一项,但是只有只读属性,不要修改。
items为可迭代对象
break 跳出循环
continue 跳过本次循环,进行下次循环
标签与goto
不建议使用
Go函数
func functionName(){}为函数的基本形式。main函数没有参数没有返回值。4
大括号必须与方法的申明同行(编译器会给每一行行尾加上分号)。
函数的一般形式:
func functionName(param type,...)(return type,...){}
func FunctionName (a typea, b typeb) typeFunc{}
func (入参申明)(出参申明){函数体}(入参) 匿名函数,入参可以参略
需要注意的是函数有三种类型
带有名字的普通函数
匿名函数或者lambda函数
方法
在go中不支持函数的重载
申明一个外部定义的函数则不需要函数体
func 函数名(参数)(返回值参数)
函数可以赋给变量
函数可以比较
函数中不可申明函数(匿名函数除外)
函数可以作为参数传递
函数也可以作为参数返回
go语言没有泛型的定义,可以通过接口或者反射去解决该问题
返回多个返回值:
func getX2AndX3(input int) (int, int) { return 2 * input, 3 * input}
func name(input int)(x1 int, x2 int){
...
return
}
... type 类似于java中的不定参,本质是一个数组?
构造类型:
type Options struct{
par1 type1,
par2 type2,
...
}
空接口 interface{}可以接受任何类型
defer 类似Java中的finally,一般用于资源的释放,该关键字会使得语句推延至函数返回之前执行
defer注册多个语句是他们会以逆序执行,类似于栈
作用
关闭文件流
解锁枷锁资源
打印最终报告
关闭数据库连接
还可以用于代码的追踪实现
注
使用defer标注匿名函数的闭包,则该函数会在return语句后执行
内置函数
名称 | 说明 |
close | 用于管道通信的关闭 |
len、cap | len 用于返回某个类型的长度或数量(字符串、数组、切片、map 和管道);cap 是容量的意思,用于返回某个类型的最大容量(只能用于切片和 map) |
new、make | new 和 make 均是用于分配内存:new 用于值类型和用户定义的类型,如自定义结构,make 用户内置引用类型(切片、map 和管道)。它们的用法就像是函数,但是将类型作为参数:new(type)、make(type)。new(T) 分配类型 T 的零值并返回其地址,也就是指向类型 T 的指针(详见第 10.1 节)。它也可以被用于基本类型:v := new(int)。make(T) 返回类型 T 的初始化之后的值,因此它比 new 进行更多的工作(详见第 7.2.3/4 节、第 8.1.1 节和第 14.2.1 节)new() 是一个函数,不要忘记它的括号 |
copy、append | 用于复制和连接切片 |
panic、recover | 两者均用于错误处理机制 |
print、println | 底层打印函数(详见第 4.2 节),在部署环境中建议使用 fmt 包 |
complex、real imag | 用于创建和操作复数(详见第 4.5.2.2 节) |
数组、切片、map
数组:
申明:var 变量名 [len] 数据类型,
与java不同,go数组的长度是可变的