Go语言讲解
Go语言介绍:
Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。
Go是一门 并发支持 、垃圾回收 的 编译型 系统编程语言,旨在创造一门具有在静态编译语言的 高性能 和动态语言的 高效开发 之间拥有良好平衡点的一门编程语言。
并发性:。Go语言为此专门创造出了一个关键字“go”。使用这个关键字,我们就可以很容易的使一个函数被并发的执行
垃圾回收:编程者不用考虑内存的泄露或者野指针的事情,因为GO语言会对内存进行管理。
Go的主要特点有哪些?
类型安全 和 内存安全
以非常直观和极低代价的方案实现 高并发 高效的垃圾回收机制
快速编译(同时解决C语言中头文件太多的问题) 为多核计算机提供性能提升的方案 可以指定cpu核数 UTF-8编码支持 可以支持多种字符格式
Go语言编写规则:
Go内置25个关键字(均为小写)
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
注释方法同C语言
// :单行注释 /* */:多行注释
Go程序的一般结构:
.页脚
.
命名方式:basic_structure.go
Go程序是通过 package 来组织的(与python类似) 只有 package 名称为 main 的包可以包含 main 函数 一个可执行程序 有且仅有 一个 main 包
通过 import 关键字来导入其它非 main 包 通过 const 关键字来进行常量的定义
通过在函数体外部使用 var 关键字来进行全局变量的声明与赋值 通过 type 关键字来进行结构(struct)或接口(interface)的声明 通过 func 关键字来进行函数的声明
.页脚
.
Go语言中,使用 大小写 来决定该 常量、变量、类型、接口、结构 或函数 是否可以被外部包所调用:
.页脚
.
根据约定,函数名首字母 小写 即为private
函数名首字母 大写 即为public
Go语言基本类型部分:
布尔型:bool - 长度:1字节 - 取值范围:true, false - 注意事项:不可以用数字代表true或false
整型:int/uint - 根据运行平台可能为32或64位
8位整型:int8/uint8 - 长度:1字节 - 取值范围:-128~127/0~255 字节型:byte(uint8别名) 16位整型:int16/uint16 - 长度:2字节 - 取值范围:-32768~32767/0~65535 32位整型:int32(rune)/uint32 - 长度:4字节 - 取值范围:-2^32/2~2^32/2-1/0~2^32-1 64位整型:int64/uint64 - 长度:8字节 - 取值范围:-2^64/2~2^64/2-1/0~2^64-1 浮点型:float32/float64 - 长度:4/8字节 - 小数位:精确到7/15小数位 复数:complex64/complex128 - 长度:8/16字节
足够保存指针的 32 位或 64 位整数型:uintptr
.页脚
.
其它值类型: - array、struct、string 引用类型: - slice、map、chan
接口类型:inteface 函数类型:func
变量的声明和赋值形式:
变量的声明格式:var <变量名称><变量类型> 变量的赋值格式:<变量名称> = <表达式>
声明的同时赋值:var <变量名称> [变量类型] = <表达式>
第一种:主要用于全局变量的使用中
第二种:此种定义方式,用于变量进行运算的时候,所得到的结果也许会和变量的类型不一样,系统可以自行推断结果变量的类型,所以这也是很方便的。 第三种:设置变量时,你已经有一个初始值时,就可以用这种方式。
常量的定义
常量的值在编译时就已经确定 常量的定义格式与变量基本相同 等号右侧必须是常量或者常量表达式 常量表达式中的函数必须是内置函数
.页脚
.
运算符
Go中的运算符均是从左至右结合
优先级(从高到低)
^ ! (一元运算符) * / % <<>>&&^
+ - | ^ (二元运算符) == != <<= >= >
<- (专门用于channel) && ||
指针
Go虽然保留了指针,但与其它编程语言不同的是,在Go当中不 支持指针运算以及”->”运算符,而直接采用”.”选择符来操作指针 目标对象的成员
操作符”&”取变量地址,使用”*”通过指针间接访问目标对象 默认值为 nil 而非 NULL
循环语句for
Go只有for一个循环语句关键字,但支持3种形式 初始化和步进表达式可以是多个值
条件语句每次循环都会被重新检查,因此不建议在条件语句中
.页脚
.
使用函数,尽量提前计算好条件并以变量或常量代替 左大括号必须和条件语句在同一行
选择语句switch
可以使用任何类型或表达式作为条件语句 不需要写break,一旦条件符合自动终止
如希望继续执行下一个case,需使用fallthrough语句
支持一个初始化表达式(可以是并行方式),右侧需跟分号 左大括号必须和条件语句在同一行
切片Slice
Go 语言切片是对数组的抽象。
Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片(\"动态数组\"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
创建切片:
var slice1 []type = make([]type, len) .页脚
.
也可以简写为
slice1 := make([]type, len) 也可以指定切片的容量 make([]T, length, capacity) 切片的初始化 s :=[]int{1,2,3} 切片截取
s1 := s[startIndex:endIndex]
将s中从下标startIndex到endIndex-1 下的元素创建为一个新的切片
示例:
package main import\"fmt\"
func main(){ /* 创建切片 */
numbers :=[]int{0,1,2,3,4,5,6,7,8} printSlice(numbers)
/* 打印原始切片 */
fmt.Println(\"numbers ==\", numbers)
/* 打印子切片从索引1(包含) 到索引4(不包含)*/ fmt.Println(\"numbers[1:4] ==\", numbers[1:4])
.页脚
.
/* 默认下限为 0*/
fmt.Println(\"numbers[:3] ==\", numbers[:3])
/* 默认上限为 len(s)*/
fmt.Println(\"numbers[4:] ==\", numbers[4:])
numbers1 := make([]int,0,5) printSlice(numbers1)
/* 打印子切片从索引 0(包含) 到索引 2(不包含) */ number2 := numbers[:2] printSlice(number2)
/* 打印子切片从索引 2(包含) 到索引 5(不包含) */ number3 := numbers[2:5] printSlice(number3) }
func printSlice(x []int){
fmt.Printf(\"len=%d cap=%d slice=%v\\n\",len(x),cap(x),x)}
以上代码的执行结果:
len=9 cap=9 slice=[012345678] numbers ==[012345678] numbers[1:4]==[123] numbers[:3]==[012]
.页脚
.
numbers[4:]==[45678] len=0 cap=5 slice=[] len=2 cap=9 slice=[01] len=3 cap=7 slice=[234]
Append()和copy()函数
如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。 下面的代码描述了从拷贝切片的 copy 方法和向切片追加新元素的 append 方法。
Go 语言Map(集合)
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
定义 Map
可以使用内建函数 make 也可以使用 map 关键字来定义 Map:
/* 声明变量,默认 map 是 nil */var map_variable map[key_data_type]value_data_type /* 使用 make 函数 */
map_variable = make(map[key_data_type]value_data_type) 示例
package main import\"fmt\"
func main(){
var countryCapitalMap map[string]string .页脚
.
/* 创建集合 */
countryCapitalMap = make(map[string]string)
/* map 插入 key-value 对,各个国家对应的首都 */ countryCapitalMap[\"France\"]=\"Paris\" countryCapitalMap[\"Italy\"]=\"Rome\" countryCapitalMap[\"Japan\"]=\"Tokyo\" countryCapitalMap[\"India\"]=\"New Delhi\"
/* 使用 key 输出 map 值 */
for country := range countryCapitalMap {
fmt.Println(\"Capital of\",country,\"is\",countryCapitalMap[country])
}/*range 关键字用于for循环中迭代数组(array)、切片(slice)、链表(channel)或集合(map)的元素。在数组和切片中它返回元素的索引值,在集合中返回 key-value 对的 key 值。 */ /* 查看元素在集合中是否存在 */
captial, ok := countryCapitalMap[\"United States\"] /* 如果 ok 是 true, 则存在,否则不存在 */ if(ok){
fmt.Println(\"Capital of United States is\", captial) }else{
fmt.Println(\"Capital of United States is not present\") }}
输出结果:
Capital of FranceisParis Capital of ItalyisRome Capital of JapanisTokyo .页脚
.
Capital of IndiaisNewDelhi Capital of UnitedStatesisnot present
.页脚
因篇幅问题不能全部显示,请点此查看更多更全内容