GO语言学习记录之一:基本语法 | 青训营笔记

76 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

Go的语言特性

了解Go的特点,区分不同语言间的特点。

  1. 高性能、高并发
  2. 语法简单、学习曲线平缓
  3. 丰富的标准库
  4. 完善的工具链
  5. 静态链接
  6. 快速编译
  7. 跨平台
  8. 垃圾回收

Go的基本语法

变量

声明变量基本有以下两种方式:

  • var/const声明,如var name string = "gypsophlia"
  • :=赋值声明,如name := "gypsophlia",自带类型推断。

变量基本类型包含以下:

  • 整数类型,int等。
  • 浮点类型,float等。
  • 字符类型, byte/rune,严格来说属于整数类型,字符可用单引号表示,如'c'
    • byte=uint8,代表ASCII 码的一个字符。
    • rune=int32,代表一个 UTF-8 字符,处理中文或者其他复合字符。
  • 字符串类型,string。字符串的字节使用utf-8编码标识Unicode文本。
  • 布尔型,bool

判断

var a,b = 1,2
if a == b {
  print("OK")
}

循环

  • 没有while关键字
for a != b {
    ...
}
for i := 0; i < 10; i++ {
    ...
}

分支

  • 不需要写break
  • switch后支持各种变量类型
  • switch也可以单纯作为多层判断的缩写
switch name {
    case "john":
        ...
    default:
        ...
}
switch {
    case a > b:
        ...
    case a < b:
        ...
    default:
        ...
}

数组和切片

关于数组和切片有许多值得注意的地方,先看分别的创建方式:

// 数组
var arr0 [2]int
arr1 := [2]int{1,2}
arr2 := [...]int{1,2}

// 切片
arr3 := []int{1,2}
arr4 := make([]int, 3)
arr5 := make([]int, 3, 10)

你可以查看这里的代码来搞清楚数组和切片的一个重要区别:数组是值拷贝,切片是指针拷贝。

Map

map是一种哈希结构,而在多并发的go程序中常常需要考虑并发安全的问题,因此在此之上有一些并发安全的哈希表,如sync.Map等,可自行查阅。

var dict map[string]string

dict["a"] = 1
dict["b"] = 2

val, ok := dict["c"]
if ok {
    ...
}

指针

Go中同样存在着指针的用法,可用性不如C/C++上的指针,但也有类似的问题,如:函数传值和函数传指针。不再多言。

结构体

基本需要掌握结构体的声明、结构体函数绑定、结构体初始化。

同时结构体中可以使用tag的语法,有助于JSON格式还。

结构体初始化的方式有很多,可以自行探索。

type User struct {
    Name string `json:"name"`
    Age int
}

func (u User) isAdult() bool {
    return u.Age > 18
}

func (u User*) growUp() {
    u.Age += 1
}

req := User{Name:"gypsophlia"}

错误处理

错误通常作为返回值返回,并每次进行判断。

func divide(a int, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("zero can't be divided.")
    }
    return a/b, nil
}

res, err := divide(10, 13)
if err != nil {
    ...
}

常用模块

  • strings 字符串操作
  • strconv 字符串和数字解析
  • json JSON解析
  • time 时间解析

参考文章