大家一起学Golang——Go语言关键字与基本语法
Golang25个关键字
关键字 | 作用 | 一级分类 | 二级分类 | 三级分类 |
---|---|---|---|---|
var | 变量声明 | 基本结构 | 变量与常量 | … |
const | 常量声明 | 基本结构 | 变量与常量 | - |
package | 包声明 | 基本结构 | 包管理 | - |
import | 包引用 | 基本结构 | 包管理 | - |
func | 函数声明 | 基本组件 | 函数 | - |
return | 函数返回 | 基本组件 | 函数 | - |
interface | 接口 | 基本组件 | 自定义类型 | - |
struct | 结构体 | 基本组件 | 自定义类型 | - |
type | 定义类型 | 基本组件 | 自定义类型 | - |
map | - | 基本组件 | 引用类型 | - |
range | - | 基本组件 | 引用类型 | - |
go | - | 流程控制 | 并发 | - |
select | - | 流程控制 | 并发 | - |
chan | - | 流程控制 | 并发 | - |
if | - | 流程控制 | 单任务流程控制 | 单分支流程 |
else | - | 流程控制 | 单任务流程控制 | 单分支流程 |
switch | - | 流程控制 | 单任务流程控制 | 多分支流程 |
case | - | 流程控制 | 单任务流程控制 | 多分流程 |
default | - | 流程控制 | 单任务流程控制 | 多分支流程 |
fallthrough | - | 流程控制 | 但任务流程控制 | 多分支流程 |
for | - | 流程控制 | 单任务流程控制 | 循环控制 |
break | - | 流程控制 | 单任务流程控制 | 循环控制 |
continue | - | 流程控制 | 单任务流程控制 | 循环控制 |
goto | - | 流程控制 | 单任务流程控制 | - |
defer | - | 流程控制 | 延时流程控制 | - |
上面时关于go的关键词其实还是挺少的,不用全看,只看自己不熟悉的,python我平常用的比较多,很喜欢这两个小巧的语言,这里附上go与python语法区别的链接go vs python 大家一起go浪~~
关键字使用方式
- var
var aa int
var bb = 15
cc := 15
dd,ee := "a","b"
- const
//声明常量,可以不用声明类型
//全局常量
const a = 13
func main(){
var b = 1
var c = int64(20)
d := a+b
e := a + c
...
}
-
package
包声明,是指同一文件夹下的文件,包名可以与文件夹名字不同(建议相同) -
import
包引用,引用路径是工作区的相对路径。若程序内引用两个不同路径下的相同包名,需要设置别名加以区分。包若是没有在程序中显示调用,则使用下划线 _ 来区分。 -
func
关于匿名函数必须在函数内部定义,下面时关于函数的几种情况
//根据函数传入参数和返回参数不同进行划分
//有固定⼊参,⽆出参数
func demo1(name string) {
return
}
//⽆固定入参,无出参数
func demo2(name string, params ...int64) {
return
}
//无入参,单参数无名称
func demo3() int64 {
return 0
}
//⽆入参,单参数有名称
func demo4() (age int64) {
return
}
//⽆入参,多参数无名称
func demo5() (int64,string) {
return 0,""
}
//⽆入参,多参数有名称
func demo6() (age int64,name string) {
return
}
- type/interface/struct
type声明结构体或者接口
interface 可以存放任意格式数据和接口定义方法
struct 结构体定义
import "fmt"
type demo interface{
func1 (string) int
func2 (int64) string
}
type demoS struct{}
//demoS的方法,demoS实现了demo接口类型
func(d *demo) func1(string)int{
return 0
}
func(d *demo) func2(int64)string{
return ""
}
func demofun(d demoI){
//d是接口值,这个类型断言检查参数d是否是demoS类型,
v,t := d.(*demoS) //又将d转成demoS类型
fmt.Println(v,t)
}
func main(){
s := &demoS{}
demofun(s)
}
- map
//map是go内置的数据类型
//下面声明了m1类型,但没有分配内存空间,直接调用会报错
var m1 map[string]int
//声明并申请了内存空间
m2 := make(map[string]int)
v, ok := m2["k"] //读取时返回值
//这个初始化同时并规定分配的空间大小
m3 := make(map[string]int,10)
-
range
一般和for配合使用(这个在python中也常见),用来遍历数组,map,string。用起来好方便 -
go
go语言中自带的并发语句,但不建议处理大文件和cpu密集型运算,可以在写日志和处理大量IO操作使用。 -
select
每个case后只能进行IO通信操作,只能是发送或接收。
多个case,go会随机选择并执行,否则select阻塞直到有满足条件的case。
在 Go 中,每执行完一个 case 后,会从 switch 语句中跳出来,不再做后续 case 的判断和执行。使用 fallthrough 语句可以在已经执行完成的 case 之后,把控制权转移到下一个 case 的执行代码中 -
chan
var c1 chan int64 //nil chan
var c2 = make(chan int64) //无缓冲
var c3 = make(chan int64, 10) //带缓冲区,chan满时,发生阻塞
var c3 = make(chan <-int64, 10) //只写,这是具有方向的channel
var c3 = make(<-chan int64, 10) //只读
- goto
无条件跳转,几乎没什么用,学过汇编的朋友应该熟悉这个。
Loop:
...
goto Loop
- defer
这个又是go语言中比较有特色的语法,只能用在函数中,在函数执行结束时会调用这个语句,一般作善后工作,比如关闭文件,关闭数据库连接等。用过的人,真香~~
func main(){
defer fmt.Println("aa")
defer fmt.Println("bb")
//结果输出bb aa ,这个时函数调用的时候这些语句被压入栈中,调用的时候出栈,所以就这个顺序
}
c0586
发布了29 篇原创文章 · 获赞 5 · 访问量 7381
私信
关注