Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
https://golang.google.cn/dl/
一步一步按照提示安装就可以
安装完成后,cmd输入go,表示已经成功安装,系统变量已经自动添加
实例测试:
建立一个workspace
test.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
包声明:放在第一行,每个GO程序都需要包含一个main包
package main
包引入:
import "fmt"
fmt是用来格式化IO的
函数:
func main(){ }
每个GO程序都必须包含一个main函数,且第一个执行。{不能单独放在一行。
注释:
//单行注释
/*多行注释*/
一行代表一个语句,若要将多个语句写在一行,则用;分隔
与C语言规则相同
1.var identifier1, identifier2 type (= value1 ,value2)并行赋值
2.先声明再赋值
var v_name v_type v_name = value
3.根据值自动确定类型
var v_name = value
4.省略var和type
v_name:=v_value 初始化声明
数字:int有符号整型 u语言int无符号整型 float浮点型 complex复数
const 常量
iota 特殊常量
iota,特殊常量,可以认为是一个可以被编译器修改的常量。
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
switch语句中fallthrough 会强制执行后面的 case 语句,但是不会判断下一条 case 的表达式结果是否为 true。
还可以使用Type Switch
if 布尔表达式(可以为多行 ) { /* 在布尔表达式为 true 时执行 */ } else { /* 在布尔表达式为 false 时执行 */ }
嵌套需要在{}内进行;
布尔表达式由多个条件组成时,用;分开
可以用多个返回值类型,也可以没有
数组定义 var variable_name [SIZE] variable_type
var balance [10] float32
初始化
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
也可以忽略数组大小
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
声明一个未指定大小的数组来定义切片:var identifier []type
用内置make()函数来创建切片: var slice1 []type = make([]type, len)
也可以指定容量,其中capacity为可选参数:make([]T, length, capacity)
切片是可索引的,并且可以由 len() 方法获取长度。
切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。
s1 := s[startIndex:endIndex]
/* 声明变量,默认 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() {
//这是我们使用range去求一个slice的和。使用数组跟这个很类似
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)
//在数组上使用range将传入index和值两个变量。上面那个例子我们不需要使用该元素的序号,所以我们使用空白符"_"省略了。有时侯我们确实需要知道它的索引。
for i, num := range nums {
if num == 3 {
fmt.Println("index:", i)
}
}
//range也可以用在map的键值对上。
kvs := map[string]string{"a": "apple", "b": "banana"}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
//range也可以用来枚举Unicode字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。
for i, c := range "go" {
fmt.Println(i, c)
}
}
sum: 9 index: 1 a -> apple b -> banana 0 103 1 111
https://www.runoob.com/go/go-interfaces.html
如何实现接口方法:
func (struct_name_var struct_name)method_name()[return_type]{}
用于两个goroutine之间通信,通过传递一个指定类型的值来同步运行和通讯
创建:ch :=make(chan chan_type,缓冲区大小)类似于切片
ch <- v // 把 v 发送到通道 ch v := <-ch // 从 ch 接收数据 // 并把值赋给 v
缓冲区中的数据,队列,先进先出
v, ok := <-ch ,ok为false代表通道未接受到数据