一、Go 语言简介
Go语言全称为Golang,是Google公司自主研发的一款开源编程语言,从2007年由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。
Go语言由于其简洁、安全、内存管理和编译迅速等特点,现已在各个互联网公司中广泛应用。Go语言一般来说用在以下几个方面:
-
搭载 Web 服务器 -
存储集群或类似用途的巨型中央服务器
由于其提供的海量并行的支持,Go语言运用在游戏服务器的开发中是非常合适的,现在不管是腾讯还是米哈游,在游戏服务器的开发上,都能看到Go语言的身影~
二、Go 语言基础语法
1.Go程序基本结构
- 包声明
- 引入包
- 函数
- 变量
- 语句 & 表达式
- 注释
举个简单的例子:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
让我们来简单剖析一下这个程序:
1.第一行代码 package main 定义了包名。在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
2.下一行 import fmt 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。
3.下一行 func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。
4.下一行 fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。这一点和java中的输出非常相似,可以参考java中的输出。
需要注意的是 { 不能单独放在一行!!!! 否则会报错,这一点又和c/c++,java不同。
2.格式化字符串
Go 语言中使用 fmt.Sprintf 或 fmt.Printf 格式化字符串并赋值给新串:
- Sprintf 根据格式化参数生成格式化的字符串并返回该字符串。
- Printf 根据格式化参数生成格式化的字符串并写入标准输出。
看一段代码:
package main
import (
"fmt"
)
func main() {
// %d 表示整型数字,%s 表示字符串
var number = 123
var name = "kiki"
var url="%d is %s's favourate number"
var str1 = fmt.Sprintf(url, number, name)
fmt.Println(str1)
}
输出结果为:123 is kiki's favourate number
3.变量声明
Go语言的变量声明有三种常用的方法:
1.指定变量类型,如果没有初始化,则变量默认为零值。
举个例子:
package main
import "fmt"
func main() {
// 声明一个变量并初始化
var a = "yolo"
fmt.Println(a)
// 没有初始化就为零值
var b int
fmt.Println(b)
// bool 零值为 false
var c bool
fmt.Println(c)
}
输出结果为:
yolo
0
false
第二种,根据值自行判定变量类型。
举个例子:
package main
import "fmt"
func main() {
var d = true
fmt.Println(d)
}
输出结果为:
true
第三种,使用:=代替var
num := 1等价于
val num int
num = 1
4.Go语言常量
(1)const
Go 语言中,const的用法和c++里面的差不太多哇,这里就不写了,偷懒~~~
(2)iota
iota,特殊常量,可以认为是一个可以被编译器修改的常量。
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
举个例子:
package main
import "fmt"
func main() {
const (
a = iota //0
b //1
c //2
d = "hhhh" //独立值,iota += 1
e //"hhhh" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢复计数
i //8
)
fmt.Println(a,b,c,d,e,f,g,h,i)
}
输出结果为:
0 1 2 hhhh hhhh 100 100 7 8
5.Go 语句条件语句
Go的条件语句和c++的都差不多啊,但是这里要着重看一下switch,这个和c++的有一些区别,用法要多元一些,让我们来看一下吧~~
switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。
switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough 。
6.Go 语句循环语句
Go 语言的循环语句,更像是c++和python的结合体。额。。。要是没学过python的话,来划个重点吧~~
Go 语言中循环语句是不带括号的,这也是Go 语言比较方便的原因之一吧。Go 语言的for循环一般来说有三种格式,
1.for init; condition; post { }
2.for condition { }
3.for { }
for循环中的range格式可以对数组、map、slice等进行迭代循环。格式如下:
for key, value := range oldMap {
newMap[key] = value
}
如果只是想读取key值或者是value值,可以采取以下办法:
for key := range oldMap
如果是只读取value的值,则可以这样:
for _, value := range oldMap
7.Go 语言函数
Go 语言的函数写法和c++的相比,主要是格式上有一些变化,然后就是可以返回多个值。
Go 语言函数定义格式如下:
func function_name( [parameter list] ) [return_types] {
函数体
}
Go 函数可以返回多个值,举个例子:
package main
import "fmt"
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("Google", "Baidu")
fmt.Println(a, b)
}
输出结果为:
Baidu Google
8.Go 语言数组
go语言的数组声明和c++差别稍微大一些,但是应该和python差不太多。
Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:
var variable_name [SIZE] variable_type
数组初始化,举个例子:
var nums = [4]float32{100.0, 23.2, 3.44, 31.0, 89.29}
如果数组长度不确定,可以使用 ... 代替数组的长度,编译器会根据元素个数自行推断数组的长度:
nums := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
如果设置了数组的长度,我们还可以通过指定下标来初始化元素:
// 将索引为 2 和 4 的元素初始化
balance := [5]float32{2:2.0,4:7.0}
9.Go 语言指针
(1)指针的定义
Go语言中指针的概念和c++的一致的,在Go 中,指针的定义格式如下:
var var_name *var-type
举两个实际例子:
var a *int /* 指向整型*/
var b *float32 /* 指向浮点型 */
(2)空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil
nil在概念上和null、nullptr、NULL是一样的。
三、实践练习例子:
(1)guessing-game
这个项目就是简单的猜数字游戏,需要注意的是生成随机数的时候,要加上时间戳,这样才能使每次生成的数都是随机的。
(2)simpledict
这个在线字典的项目,要注意的是整个抓包的过程,第一次接触的话,会比较吃力(比如我)
(3)proxy
不会,开摆
明天好好学一下,看了下视频,应该是涉及到计网的知识。
四、课后个人总结:
今天是字节青训营的day1,学了一些Go语言的基础语法,然后跟了三个项目,但是明显感觉到后两个项目难度比较大,再加上自己对Go语言并不熟悉,所以学起来会比较吃力,需要静下心来学。
五、引用参考:
-
字节青训营Go语法基础课