这是我参与「第五届青训营 」笔记创作活动的第1天。
Go语言特色
- 简洁、快速、安全
- 并行、有趣、开源
- 内存管理、数组安全、编译迅速
Go 语言用途
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
Go语言基本语法
变量的基本类型
1.bool类型
2.数值类型
int8、int16、int32、int64、intuint8、uint16、uint32、uint64、uintfloat32,float64complex64,complex128byterune
我们发现有一些变量后面跟了个数字,这其实就是表示这个变量的占用的位的大小,例如int8就表示占用8个bit。
3.string类型
变量的定义
1.第一种通过var关键字来定义
var a = "hello"
var b = 3
var c float64 = 3.14
注意这里如果不给变量初始化的话,则需要带上这个变量的类型:
var a string
var b int
var c float64
2.直接定义
a := "hello"
b := 3
c := 3.14
常量的定义
常量的定义其实就是将变量的var变成const关键字即可
const str = "Hello World!"
分支循环
if-else
package main
import (
"fmt"
)
func main() {
var a int
fmt.Scanf("%d", &a)
if a < 10 {
fmt.Println("step1")
} else if a < 20 {
fmt.Println("step2")
} else {
fmt.Println("step3")
}
}
switch case
package main
import (
"fmt"
)
func main() {
var a int
fmt.Scanf("%d", &a)
switch a {
case 1:
fmt.Println("This is 1")
case 2:
fmt.Println("This is 2")
case 3:
fmt.Println("This is 3")
default:
fmt.Println("This is error")
}
}
在c++里面,switch case如果不在目标case下加break的话会然后会继续往下跑完所有的case,在go语言 里面的话是不需要加break的。 相比C或者C++,go语言里面的switch功能更强大。可以使用任意的变量类型,甚至可以用来取代任意的if else语句。你可以在switch后面不加任何的变量,然后在case里面写条件分支。这样代码相比你用多个if else代码逻辑会更为清晰。
for循环
package main
import (
"fmt"
)
func main() {
var a int
fmt.Scanf("%d", &a)
for i := 1; i < a; i++ {
fmt.Println("index = ", i)
}
}
数组
数组的定义只需要将申请的空间放在变量名和类型中间即可
//声明数组
var a[10]int
//声明并初始化操作
var d = [3]int{1,2,3}
函数
// 传入两个 int 类型的值,然后返回其和,且也是int类型
func add(a int, b int) int {
return a + b
}
// 传入一个stirng参数,然后没有返回值
func printt(str string) {
fmt.Println("Hello", str)
}
Go函数可以返回多个值,一般来说,第一个是函数的返回值,第二个是错误信息。
切片
切片(slice)与数组的区别是切片的长度不是固定的而是可变的,比数组的用途更加广泛。 切片声明需要通过 make 来进行,需要指定切片的类型以及长度,例如下面为创建一个长度为 3 的string类型的切片。
// 声明一个空切片
s1 := make([]string, 3)
// 声明并初始化
s2 :=[] int {1,2,3,4,5,6}
指针
貌似和C/C++中的指针的操作是一样的,通过*访问,然后&是取地址符
不过Go中的指针不支持指针运算。
new创建指针
ptr := new(int) ,其中的int可以替换成其他数据类型
- 关于指针的解引用是和
C/C++类似的 - 想函数中传入指针参数的时候,我们在函数的定义时,需要使用
*来表示接受指针的。
结构体
结构体声明语法:
type StructName struct{
FieldName type
不同成员之间直接换行写就行,不用,隔开。
成员函数
成员函数写在结构体外面,格式如下:
func (t StructName) func_name(str string) int {
return 1
}
这里我们将当前的这个结构体传入,当然也可以使用结构体指针,这样就能对当前的这个结构体变量的进行一些修改操作
错误处理
Go 语言通过内置的错误接口提供了非常简单的错误处理机制。
error类型是一个接口类型,这是它的定义
type error interface {
Error() string
}
如果是函数内部抛出异常,那么对于当前函数就应该多一个errors的接收变量。
数据结构
Go语言内置了一个数据结构,即map
Map 是一种无序的键(key)值(value)对的集合,也被称为映射、字典。
Map是无序的,支持类似数组和切片的操作。
m := make(map[string]int)
其中,string为键,int为值,对元素的访问也是按照下标进行访问,对于不存在的键值对,返回0,这里也有一个问题,假设一个键值对的key也是0,有的时候就可能存在误解,于是Go在键值对的查询结果时,返回了两个值,一个是结果,一个是,是否存在。