Go语言的特性与基础语法

58 阅读3分钟

Go语言是由C语言演化过来的,同时和C语言比起有许多优势,它更简单易学,有垃圾回收功能,支持快速搭建网络服务

Go语言的核心特征:

  1. 高性能、高并发
  2. 快速编译
  3. 静态链接
  4. 垃圾回收

基于这些特点,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相似,每个变量都有自己的变量类型

变量声明格式

  1. 使用var关键字:var name type = xxx , 可以选择写出变量类型,如果没写也会自动推导
  2. 使用:=表示声明+赋值: 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更加灵活,功能强大。

  1. Go语言中的switch不需要加break
  2. 可以不在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也可以直接打印。

  1. 使用make来创建空map: make(map[key_type]value_type
  2. 获取value:map["key"]
  3. 删除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}