GO
简介
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。Go作为Google2009年推出的语言,其被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
基础语法
Hello World
对于一个新建的Go文件,它是长这个样子的
package main
func main(){
}
函数的作用域都在包(main)里,我们可以进行输入我们的第一个程序。
package main
import "fmt"
func main() {
fmt.Println("Hello,World")
}
要使用当fmt里面的println进行一行一行的打印,而当我们键入fmt时,程序会自动导入“fmt”。
变量
Go语言变量名由字母、数字、下划线组成,首字母不能为数字。
使用关键字 var 定义变量
var name type
这里定义了一个int类型的a和字符类型的s,两个变量都没有赋初值,所以a是0,s是空串
Go语言定义的变量必须要使用,不然会出错
var a int
var s string
fmt.Println(a,s)
还可以同时给多个变量赋指,
也可以不使用var关键字,使用**:=**让程序自动去判断类型。
var a,b,c,s = 3,4,true,"def"
a,b,c,s:=3,4,true,"def"
常量
与变量定义方法相似
const name type
不过常量可用于枚举
const(
cpp=0
java=1
python=2
golang=3
)
fmt.Println(cpp,java,python,golang)
输出结果为0 1 2 3
iota,特殊常量,可用于自增。
const(
cpp =iota
java
python
golang
)
fmt.Println(cpp,java,python,golang)
还是得到一样的结果0 1 2 3
第一个iota等于0,再新一行使用它就会自加1
const(
b = 1<<(10*iota)
kb
mb
gb
tb
pb
)
fmt.Println(b,kb,mb,gb,tb,pb)
得到输出为1 1024 1048576 1073741824 1099511627776 1125899906842624
**<<**表示左移的意思(二进制),b等于1,第一次左移十位,就是变成10000000000,化成十进制也就是1024,以此类推后面都是这样。
条件
if 语句(由一个布尔表达式后紧跟一个或多个语句组成)
const filename="abc.txt"
content,err:=ioutil.ReadFile(filename)
if err!=nil{
fmt.Println(err)
}else{
fmt.Printf("%s\n",content)
}
在这个程序中,新建了一个名为abc的文本文件,它里面的内容如下
并使用到ioutil.ReadFile用于读取函数,它一共会返回两个值,一共是文本内容,还有一个是出错内容。使用 if语句,当函数的出错内容不为nil(空)时打印出错内容,否则打印真实内容。
输出为
Hello Go
abc
123
switch语句(用于基于不同条件执行不同动作)
func grade(score int) string {
g:=""
switch{
case score<0 ||score>100:
panic(fmt.Sprintf("Wrong Score %d",score))
case score<60:
g="F"
case score<80:
g="C"
case score<90:
g="B"
case score<=100:
g="A"
}
return g
}
func main() {
fmt.Println(grade(59),
grade(60),
grade(72),
grade(88),
grade(100),
grade(-3))
}
定义一个函数用于去判断成绩的等级,首先定义一共g(空串)去接受定义的等级值。再定义一个switch,首先第一个case条件设置为如果是小于0或者大于100值不成立,随后再定义各个等级的分值范围,最后返回等级。
再用到main函数去调用这个函数。
switch不用每个case都break
循环
先定义一个累加的简单循环。语法与C语言相似 for 初始值;条件;循环变量增值。
i:=0
sum:=0
for i=0;i<=10;i++{
sum+=i
}
fmt.Println(sum)
这里我们用一个十进制转换二进制的函数来体现一下,go语言的for语句可以不用初始值。
func convertToBin(n int) string{
result :=" "
for ;n>0;n/=2{
lsb := n%2
result=strconv.Itoa(lsb)+result
}
return result
首先还是定义一个空串用于接受值,求二进制相当于,每次对一个数对2求余数模,再整除2,直到哪个数为0时。
用一个13举例,13对2求余为1,转化为字符型加再空串上,13再整除2,等于6,第二个循环,6对2求余为0,再加到result上,注意是加到左边,因为最后结果是取余倒着取。
函数
func name([parameter list]) [return type]
这里定义一个简单的算术函数。传入a(int),b(int),op(string),传出类型是int
func cal(a int,b int,op string) int{
switch op {
case "+":
return a+b
case "-":
return a-b
case "*":
return a*b
case "/":
return a/b
default:
panic("unsupported operation" +op)
}
func main() {
fmt.Println(cal(3,4,"+"))
}
最后再mian函数中调用,得到结果7
然而函数还可以有两个返回值。
func div(a,b int) (q,r int){
return a/b,a%b
}
func main() {
fmt.Println(div(12,5))
分别传入一个12,一个5,对其进行除和取余操作。得到结果2 2