Go语言是由C语言演化过来的,同时和C语言比起有许多优势,它更简单易学,有垃圾回收功能,支持快速搭建网络服务
Go语言的核心特征:
- 高性能、高并发
- 快速编译
- 静态链接
- 垃圾回收
基于这些特点,Go语言适合用来编写和网络服务相关的基础设施。
Go语言的Hello World
//表示这个文件属于main包
package main
//导入标准库
import(
“fmt”
)
//main函数
func main(){
fmt.Println("hello world")
}
Go语言是一门编译性语言,使用go命令来调用程序。go命令有一系列子命令。最简单的一个子命令就是run。这个命令编译一个或多个以.go结尾的源文件,链接库文件,并运行最终生成的可执行文件。
使用run编译文件helloworld.go:
$ go run helloworld.go
hello world
使用build编译程序并保存结果留到之后使用
$ go build helloworld.go
$ ./helloworld
hello world
Go语言代码通过包(package)组织,和其他语言的library与module相似
变量(variables)
Go语言是强类型语言,和C相似,每个变量都有自己的变量类型
变量声明格式
- 使用var关键字:
var name type = xxx, 可以选择写出变量类型,如果没写也会自动推导 - 使用
:=表示声明+赋值:name := xxx,这时会自动推导变量类型
和大部分语言不同,变量类型写在变量名称后面
常量把var换成const,但是常量没有确定的类型,会自动根据上下文确定类型
var a = "str"
var b int = 1
\\重复声明a会导致错误
\\a := "str1"
var e float64
f := float32(e)
if else
Go语言的if else和C相似,只是if后面没有括号,并且执行的代码必须用{},不能写在同一行
if 1%2 == 0 {
//code
} else {
//code
}
循环(loops)
Go语言中没有while循环,只有for循环,可以用break或者continue跳出循环
for i:=0; i < 10; i++{
if i%2 == 0 {
continue
}
fmt.Println(i)
}
j := 1
//same as while loop
// while(j<=3){j++;}
for j <= 3 {
j = j + 1
}
switch
和C相比,Go语言中的switch更加灵活,功能强大。
- Go语言中的switch不需要加break
- 可以不在switch后面加变量,在case里面写条件分支, 取代if else语句
a := 1
switch a {
case 1 :
fmt.Println("one")
case 2:
fmt.Println("two")
default:
fmt.Println("other number")
}
//不在switch后面加变量
t := time.Now()
switch {
case t.Hour()<12:
fmt.Println("morning")
default:
fmt.Println("afternoon")
}
数组(Array)
Go语言的数组是一个具有编号、长度固定的元素序列,和很多语言不同,数组可以直接打印
var a [5]int
a[4] = 100
b := [5]int{1,2,3,4,5}
//print list
fmt.Println(b)
var 2dlist [2][3]int
切片(slice)
Go语言的切片操作和python类似,但是不支持负数索引。切片的长度是可以改变的,使用append()增加元素。还可以指定容量(cap)。
切片在func中传递时,传递的是指针,而数组传递的是值。因此,当切片在函数中改变时,函数外面的切片也会同时改变。
s := make([]string, 3)
s[0] = "a"
s = append(s, "d)
//len=3, cap=5
a := make([]int, 3, 5)
map(=hashmap)
和其他语言一样,go的map包括key-value pairs,并且在遍历时完全无序。Go语言的map也可以直接打印。
- 使用make来创建空map:
make(map[key_type]value_type - 获取value:
map["key"] - 删除pair:delete(map_name,key_name)
//use make to create map
m := make(map[string]int)
//insert pairs
m["one"] = 1
m["two"] = 2
//print map
fmt.Println(m) //map[one:1 two:2]
fmt.Println(m["one"]) //1
//it will return 0 if key doesn't exist
fmt.Println(m["unknow"]) //0
//deleting a pair
delete(m,"one")
//another way to create map
m2 := map[string]int{"one":1, "two":2}