这是我参与「第五届青训营」伴学笔记创作活动的第 1 天
一、认识GO语言:
-
GO语言简述
Go语言是Googel开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编译语言
-
GO语言特点
- 高性能、高并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
- Go语言的优势
具有像Python一样的简洁代码、开发速度,又具有C语言一样的执行效率,优势突出。
二、基础语法:
-
HelloWorld
犹如定律一般,学习一门语言的第一件事就是输出HelloWorld,那么我们就从这个HelloWorld中读出点门道
以上是GO语言输出Hello World的代码,那么可以看出什么呢?我们从上到下来看一遍:
第一行package main:声明了一个名为main的package,跟Java的package概念相似,表示为一个相同功能代码的集合。一个package会包含一个或者多个.go源代码文件,每一个源文件都是以package开头。
第二行import "fmt":import语句也跟Java类型,引入其它package到当前文件中,这样可以在当前文件中使用其它package的变量、常量、类型、方法等。GO标准库提供了一百多个package,而fmt这个package包含了输入输出的各种函数,例如下面fmt.Println就是其中的一个输出函数
第三行func main():声明了一个main函数,可以看出在GO语言中使用func声明一个函数,后面紧接着函数名
第四行 fmt.Println("Hello World!"):函数内的执行逻辑,fmt.Println()函数输出文本内容,fmt是import进来的包,通过fmt.方法来调用fmt包内的方法
通过简单的HelloWorld可以学习到:
1、通过package声明一个包
2、使用import导入其它包
3、使用func声明一个函数
4、main函数是Go语言的入口
5、语句的结尾不需要分号结束
6、GO语言不需要显示声明方法或者变量的作用范围
(GO语言通过变量或者方法名的首字母是大写还是小写来确定作用范围,大写字母开头的为public,小写字母开头的为private)
7、通过包名.方法名调用方法
- 变量
GO语言的基本类型有:
布尔值:bool
字符串:string
整型:int8、int16、int32、int64 (int在32位操作系统上是int32,在64位操作系统上的int64)
无符号整型:uint8、unit16、unit32、unit64 (uint在32位操作系统上是int32,在64位操作系统上的int64)
浮点型:float32、float64
GO语言中声明一个变量:
1、声明变量的一般形式是使用 var 关键字:var [name] [type]
2、常量使用关键字 const 定义,用于存储不会改变的数据
3、例如上述代码 var a = "initinal" ,此时var [name] [type] 中的type可以省略
4、var也可以省略,使用 := ,例如 tmp := 10
5、只有整型、浮点型、字符串和切片能够强制转换
6、类似Java可以使用 + 进行字符串拼接
-
if else
if else 与Java用法类似,在GO语言中省去了双括号(),而且在if 后面可以声明变量
-
循环
在GO语言中只有一种循环,就是for循环 其形式有:
for{ 表达式 } for i := 0; j < 10; j++ { 表达式 } for i < 10 { 表达式 } -
switch
switch的用法也和Java类似,跟if else一样不需要双括号,跟java不同的是case中不需要手动break,每一个case执行完默认break,也可以使用switch代替多个if else
-
数组
声明数组
var a [5]int a[4] = 100 b := [5]int{1,2,3,4,5} var twoD [2][3]int -
切片
s := make([]string,3) s[0] = "a" s[1] = "b" s[2] = "c"Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片(“动态数组'),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
-
map
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
可以使用内建函数 make 也可以使用 map 关键字来定义 Map:
/* 声明变量,默认 map 是 nil */ var m map[key type]value type /* 使用 make 函数 */ m := make(map[key type]value type) -
range
Go 语言中 range 关键字用于for循环中迭代数组 (array)、切片 (slice)、链表 (channel)或集合 (map)的元素。 在数组和切片中它返回元素的索引值,在集合中返回 key-value 对的 key 值。
num := []int{1,2,3} sum := 0 for i,num := range nums{ sum += num if num == 2 { fmt.Println("index:",i,"num",num) } } m := map[string]string{"a":"A","b":"B"} //遍历map for k,v := range m{ fmt.Plrintln(k,v) } //遍历map中的key for k := range m{ fmt.Println("key",k) } -
函数
Go 语言函数定义格式如下:
func 函数模( 参数列表 ) [返回值类型(为void时可以省略)] {
逻辑代码
}
- 指针
GO语言中也有指针,如上述代码所示,需要通过函数改变变量值时需要传递变量地址
- 结构体
GO中不存在类Class的概念,而是结构体Struct的概念
声明结构体:
type user struct{
name string
password string
}
声明结构体变量
a := user{name:"wang",password:"1024"}
b := user{"wang","1024"}
c := user{name:"wang"}
c.password = "1024"
var d user
d.name = "wang"
d.password = "1024
-
结构体方法
声明结构体方法:
//检查密码是否相等 func (u user) checkPassword(password string) bool{ return u.password == password } //修改密码 func (u *user) resetPassword(password string){ u.password == password } -
错误处理
GO语言中没有像Java那样的错误处理(throw,try-catch等)操作,GO中通过判断返回值来表示是否错先错误
//需要引入"error"包 import "error" //声明函数 func findUser(users []user, name string) (v *user, err error){ for _,u := range users { if u.name == name { return &u, nil } } return nil, errors.New("not found") } //创建变量接收函数值 u, err := findUser([]user{{"wang","1024"}},"wang") if err != nil { fmt.Println(err) return } -
字符串操作
三、GO语言入门实战:
三个实战:
-
猜谜游戏
猜谜游戏项目中使用到了变量创建、fo循环的使用、错误处理、输入输出、if else等基础知识
-
在线词典
在线词典项目中使用到了结构体、json处理、函数声明等基础知识
-
SOCKS5 代理
(时间关系暂未实现和总结)
四、个人总结:
因为有一定的Java基础,所以学习起GO语言也比较容易入门,但是这一门语言与Java也有许多的不一样,敲代码的时候经常习惯性使用了Java的语法,总体来说还是比较容易上手的一门语言,使用感觉也比较轻便。当然这是初体验与初感受,更多还是得继续学习巩固。
五、引用参考: