您的当前位置:首页正文

Go语言基础讲解

2020-08-01 来源:爱站旅游
导读Go语言基础讲解
 .

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

.页脚

因篇幅问题不能全部显示,请点此查看更多更全内容