GO语言基础语法 | 青训营笔记

48 阅读4分钟

Golang基础语法

  1. Go程序基本结构

    package main // go程序入口,表示该程序属于main包
    
    import "fmt" // 导入标准库中的包
    
    func main() { //main函数,入口函数
    	fmt.Println("Hello world") //使用fmt包中的函数打印
    }
    

    在终端中使用go run命令编译Go程序并直接运行,使用go build编译Go程序测试是否编译错误。后者会生成可执行文件,后者不会。

  2. 变量的声明和使用

    Go中常用的类型包括字符串、整型、浮点型和布尔型,变量类型可以显示声明或者隐式声明,显示声明会自动判断变量类型,使用var关键字声明一个变量。变量的声明有以下几种方式:

    (1)var identifier = value,Go将自动判断变量的类型

      var a = 10
      var b = "hello world"
      var c = true
    

    (2)var identifier type = value,显示声明变量的类型

      var a int = 10
      var b string = "hello world"
      var c bool = true
    

    (3)var identifier0 type / identifier1 := indentifer,声明一个变量0及其类型,然后使用:=符号赋值给变量1

      var a int 
      var b string 
      var c bool 
      d := a
      e := b
      f := c
    

    需要注意的是=:=,前者只能用来赋值,后者表示声明和赋值。Go中声明的变量必须使用,否者编译不通过,这和c、Java等有区别;而常量使用const关键字声明(常量的值可以是表达式),在程序中可以不使用,如下:

    e2f5c813f801c1bdff1fbfff0aa1d079.png

  3. 选择结构与循环结构

    (1)选择结构使用if condition {} else {},其中条件不需要圆括号(),选择结构内部需要使用花括号{}

    (2)Go中循环结构只使用for condition {},与C类似,条件也不需要圆括号

    (3)Switch分支中可以使用任意类型作为条件,在case中不需要使用break跳出

  4. 数组与切片(slice)

    (1)数组为定长,使用len得到数组长度。示例如下:

      var a [4]int
      b := [4]int{1, 2, 3, 4}
      c := [2][2]int{{1, 2}, {3, 4}}
    

    (2)切片可以看作可变长的数组,使用make关键字声明。append函数可用来在切片后添加元素,copy函数可用来将所有元素赋值到一个新切片。切片可以使用索引加冒号的方式获取数组元素,与python类似。

      s0 := make([]string, 2)
      s1 := []string{"1", "2", "3"}
    
  5. map

    Go中使用identifier := make(map[KeyType]ValueType, initialCapacity)声明一个map。map为无序集合,通过key查找value。

      m := map[string]int{ //创建一个切片并赋初值
    		"key1": 1,
    		"key2": 2,
    	}
      fmt.Println(m) //打印切片
      v1 := m["key1"] //查找key1的值
      fmt.Println(v1)
      v3, exist := m["key3"] //查找key3的值,不存在v3返回空值,int型为0,exist返回false
      fmt.Println(v3, exist)
      delete(m, "key2")
      fmt.Println(m) //打印删除后的切片
    
  6. 函数

    Golang中func关键字定义函数,参数类型写在变量后面,返回值可以有多个值

    func add(a int, b int)(v int, flag bool) {
    	return a + b, true
    }
    
    func add2(a, b int)(v int, flag bool) {
    	return a + b, true
    }
    
  7. 指针与结构体

    Go中指针和结构体与C类似,使用*定义一个指针,type identifier struct {}定义一个结构体。可以在函数声明中指定结构体,相当于类中方法。

    type user struct{ //定义一个user结构体
      name string  //姓名
      sex bool  //性别
    }
    
  8. 错误处理

    Go中错误处理没有像Java中的try... catch...,错误处理的方法主要是使用error类型返回错误信息

  9. 字符串操作

    字符串操作导入strings包,调用不同的函数对字符串进行需要的操作,常用的有:

    func Compare(a, b string) int   //比较两个字符串,返回0表示相等,1表示a>b,-1表示a<b
    func Contains(s, substr string) bool  //是否包含子串substr
    func HasPrefix(s, prefix string) bool  //前缀是否为prefix
    func HasSuffix(s, suffix string) bool  //后缀是否为suffix
    func Index(s, substr string) int    //子串的开始序号,从0开始
    func Join(elems []string, sep string) string  //增加字符串
    func Repeat(s string, count int) string  //将原串重复count次
    func Replace(s, old, new string, n int) string //替换字符串,n=-1时全部替换,n>0时,按查找顺序替换n个
    func Split(s, sep string) []string  //去除指定子串
    
    
  10. JSON处理

    导入官方encoding/json库,结构体中只需要保证每个的字段第一个字母为大写,就可以用json.Marshal序列化,json.Unmarshal反序列化。

    package main //该代码来自官网https://pkg.go.dev/encoding/json#Marshal
    
    import (
    	"encoding/json"
    	"fmt"
    	"os"
    )
    
    func main() {
    	type ColorGroup struct {
    		ID     int
    		Name   string
    		Colors []string
    	}
    	group := ColorGroup{
    		ID:     1,
    		Name:   "Reds",
    		Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
    	}
    	b, err := json.Marshal(group)
    	if err != nil {
    		fmt.Println("error:", err)
    	}
    	os.Stdout.Write(b)
    }
    
    Output:
    
    [{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]
    

总结以上strings包操作字符串,encoding/json操作json数据,time包含时间处理,strconv包含数字和字符串的转换,osos/exec获取系统相关的操作。