Go语言入门 | 青训营笔记

430 阅读4分钟

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

Go语言入门

开发环境

  1. 安装Go

    • Golang官网下载对应平台的安装包

    • 安装后,配置环境变量

      新建系统变量GOROOT,值为Go的安装路径

      双击Path变量,能看到自动添加的Go环境变量,Go的安装路径\bin

  2. 配置IDE

    Goland:直接安装即可,无需做过多配置

基础语法

入门案例

package main

import (
    "fmt"
)

func main(){
    fmt.Println("hello world")
}

package main代表该文件属于main包的一部分,main包是程序的入口包,代表该文件是程序的入口文件

导入了标准库里面的fmt包,这个包主要用于向屏幕输出字符串,格式化字符串

main函数为程序入口,函数中调用了fmt.Println来输出hello world

此外还可看出如果Go一行上只有单条语句,不需要使用分号

变量 常量

声明变量的一般形式(可以一次声明多个)

没有初始化,默认为零值

变量类型后置,Go支持类型自动推断,为变量初始化时可以省略类型

var identifier [type] = value

可简写为

identifier := value

常量即使用const替代var

const identifier [type] = value

if else

if后面的布尔表达式没有括号,执行语句必须有大括号

if 布尔表达式 {
    ...
} else if 布尔表达式 {
    ...
} else {
    ...
}

循环

Go只有for循环,有3种形式

  1. 和c的for一样:

    for init;condition;post { ... }
    
  2. 和c的while一样:

    for condition { ... }
    
  3. 无限循环:

    for { ... }
    

switch

switch默认case最后自带break语句

可以使用fallthrough来强制执行后面的case语句

switch [var1] {
    case value1:
    	...
    case value2:
    	...
    default:
    	...
}

数组

var a1 [SIZE]type
a2 := [SIZE]type{...}

真实业务中很少使用数组,因为长度固定,更常用的是切片

切片

切片是一个长度不固定的数组,有更多的操作

s := []type {val1,val2...}

或者使用make()函数来创建一个切片

len为切片的初始长度

capacity是可选参数,用来指定容量

s := make([]type, len, capacity)

append()和copy()函数

切片可以使用append()函数追加元素

append在操作的时候,如果容量不够,会发生扩容并返回一个新的切片,所以需将append的结果赋值给原切片。

copy()函数可以在两个切片间拷贝数据

切片的截取

可以通过[lower-bound:upper-bound]来截取切片

左右数字均可省略,左省略表示从第0个开始,右省略表示到最后一个

map

使用make来创建map

type1:键的类型

type2:值的类型

m1 := make(map[type1]type2)

提前初始化map

m2 := map[type1]type2{key1 : value1,key2 : value2...}

通过[]语法进行键值对的读写

m[key] = value
fmt.Println(m[key])

读有两个返回值,第二个值是布尔值,用来判断key是否在map中存在

v,ok = m[key]

使用delete()函数删除键值对

delete(m,key)

range

for range用于遍历数组、切片、map

range会得到两个返回值

不需要某个值时,可用_忽略

遍历数组、切片时一个是索引,一个是对应值

for idx, value := range s {
    s[idx] = value
}

遍历map时一个是键,一个是值

for key, value := range m {
    m[key] = value
}

函数

格式如下:

func function_name( [parameter list] ) [return_types] {
   函数体
}

指针

Go初步支持指针,相比c和c++,支持的操作非常有限

指针的主要用途是对常用参数进行修改

结构体

结构体是带类型字段的集合

定义结构体

type struct_name struct {
   member_name1 type1
   member_name2 type2
   ...
}

初始化结构体

可以用结构体名称来初始化一个结构体变量

通过.操作符来访问结构体对象

variable_name := struct_name(value1,value2...)
//或
variable_name := struct_name(key1:value1,key2:value2...)

struct_name.member

结构体作为函数参数

有指针和非指针两种用法

使用指针可以实现对结构体进行修改,某些情况下,避免大结构体拷贝的开销

结构体方法

结构体方法也分为有指针和非指针两种用法

有指针便可以实现对结构体进行修改

声明方式如下:

func (s struct_name) function_name( [parameter list] ) [return_types] {
   函数体
}

之后便可以直接调用

s.fuction_name( [parameter list] )

错误处理

不同于Java使用的异常,Go用单独的返回值来传递错误信息,能很清晰知道哪个函数返回了错误,并能用简单的if else来处理错误

在函数的返回值里面加上一个error,代表这个函数可能返回一个错误

导入errors包,使用errors.New便可返回一个错误信息

标准库

标准库strings包有字符串操作功能

在标准库fmt包下有字符串格式化功能

在标准库encoding/json包下有JSON处理功能

在标准库time包下有时间处理功能,Go使用的不是传统的时间模板,而是2006-01-02 15:04:05一个特殊的时间

在标准库strconv包下有数字解析功能

在标准库osos\exec包下有获取进程信息功能