知识点var,for循环、while循环、死循环、空标示符、if语句、多行注释、包管理等
1、var变量声明
var是用来声明变量的关键字,一般格式是
var 关键字 变量类型
比如
// 声明一个string类型的变量,名称为name。常用的变量声明方式之一
var name string
完整格式
var 关键字 变量类型 = 赋值表达式
比如
var name string = "Jack"
变量在声明的时候可以初始化,如果没有显式的初始化,则会根据变量类型隐式地初始化为0或空字符等等。这是Go语言中的zero-value 机制,保证每个变量都有一个合适的类型。
其它的声明和初始化的方式有
//使用:=,也叫短变量声明,常用的变量声明方式之一。
name := ""
//显式初始化,隐式的类型
var name = ""
//显式初始化,显式的类型
var s string = ""
2、支持循环的语句for
结构如下
for 初始化语句; 条件语句;执行后的语句{
//一些操作语句
}
初始化语句在for循环开始之前执行。
Go里面的while循环通过将for循环中的初始化语句和执行后的语句删除来表达,结构如下
for 条件语句 {
}
Go里面的死循环直接将for循环的初始化语句、条件语句、执行后语句删除表达,结构如下
for {
}
Go里面也使用continue的关键字允许跳过一些执行语句,直接进入下一次循环。
3、空标示符
也就是下划线标示"_"。它的出现是由于Go语言不允许出现未使用的局部变量。它在语法上需要一个临时变量,但是代码逻辑不需要的时候使用。比如,和range配合起来,range返回的是键值对。空标示符可以作为索引值(key)使用,也可以代替值使用。如果真的需要使用这个变量,还是最好起个名字:)
//代替键使用
for _, name := range os.Args[1:] {
}
空标示符是没有办法使用的。
4、 条件语句if
跟其它语言语法无区别,格式如下
if 条件语句 {
}else {
}
5、多行注释
跟C和C++一样,GO使用/* ... */作为多行注释。
6、格式化输出
使用fmt里的Printf函数,可以达到和C语言中printf同样的效果
fmt.Printf("%d, %s\n", id, name)
7、指针
Go语言也提供指针,通过&来获取指针地址,*来获得指针所指向地址的值。空的指针是nil。
8、常用包
Go语言有着100余个标准包,提供大量的基础函数。提供包管理工具是基于模块化管理的思想,让相似的功能聚合到一起,达到高类聚的设计理念,这为大型工程的设计和维护提供了基础。包只需要对外暴露接口和帮助文档,而实现的细节则封装到每个包的具体实现内。通过包的封装,程序的变动将只会影响局部,而不是全局。
试了一下大概有143个包。
Go 语言的导入使用import。如果打算对外提供包,则最好在包前加上域名。
import path
在每个文件的开通使用package来声明该包的名称。只有路径+包才能定义具体使用的包,即Apath/Apackage和Bpath/Apackage虽然名称相同,但是不同的包。面对这样的情况引入包的程序,可以选择使用一个别名来替代其中一个重名的包(别名只在导入的文件中有作用),如下:
import (
"Apath/Apackage"
xpackage "Bpath/Apackage" //使用别名,避免冲突
)
例举一些常用的包和其中的函数功能。
net 和网络相关http.Get, http.HandleFunc,http.ListenAndServe
io 和输入输出相关 ioutil.ReadAll,io.Copy, ioutil.Discard
math 提供数学计算
image 和图像处理相关
os 和系统相关Stdout Stderr等
fmt 和格式化输出相关Printf,Println等fmt.Sprintf
time 和时间相关time.Now
log 和日志相关,log.Fatal
syn 和同步相关sync.Mutex(互斥锁)
flag 提供命令行传递参数的功能,如flag.Parse(),flag.Args()
使用go doc工具提供查看每个包或者函数的支持文档,也可以通过https://golong.org/pkg获取相关信息。
9、管道
Go语言中Gorutine之间通信的方式为Channel。
//管道的创建
ch := make(chan 类型)
//从管道中获取
fmt.Println(<-ch)
//输出到管道
ch <- fmt.Sprintf("")
10、变量名称
Go语言中包名一般为小写,外部可见的函数、变量一般大写。使用驼峰命名法。
11、文件结构
每个文件需要写上属于哪个package,文件属于哪个package。文件结构如下组织
package XXXX
import XXXX
包级别的类型、变量、常量、函数声明
函数定义
12、函数结构
Go当中的函数结构如下定义
func 函数名称 (参数名称 参数类型)返回值类型 {
}
13、作用域
Go语言的变量是有作用域的,分为4种:
universal 全局的比如内置函数、类型等,float64、new
package level 任何函数外的变量
file level 导入的变量、函数等
local 本地变量
可以在不同的范围内声明相同名称的变量,但是存在一种shadow的机制,shadow是指声明的变量有着相同的名字,但是作用域不同,则更靠近执行语句内部的声明会让更外部的失去效果(inaccessible)。比如new在Go中用来创建一个变量。但是,一不小心重定义该名称,则new就失去了本来的作用,变成一个普通的变量。如下代码段所示
func delta(old, new int) int { return new - old}
14、垃圾回收机制
Go语言提供垃圾回收机制,使用者不需要显式地分配和释放内存,但使用者仍然需要考虑如何利用好内存。比如,避免长生命周期的对象中出现指针指向一个短生命周期的对象,长生命周期对象不回收的情况,会让垃圾回收机制也无法回收分配的短生命周期的对象,造成内存浪费。
15、声明新的类型
使用基本的类型来声明新的类型
type 新的类型名称 低层类型
比如,Age类型都是int型的
type Age int
不同的类型都有转换操作T(x),即将x转换成T类型。低层类型相同的两个新类型不能直接比较。
16、元组赋值
Go语言中赋值的一种方式,让赋值“=”的右边和左边一一对应。在等式两边同时需要出现相同变量的场景(比如交换值),该机制非常非常好用。该机制基于更新左边变量前,右边的值都已经确定下来(evaluted),因此,不用担心在赋值的时候有负面效果。
x, y = y, x
网友评论