Go基础语法 | 青训营笔记

65 阅读4分钟

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

Go语言基础语法

首先通过一段简单的代码了解Go语言

package main

import (
   "fmt"
)

func main() {
   fmt.Println("HelloWorld")
}

其中package main表示该程序为main包(main即为整个项目的入口包)

improt("fmt")则表示导入标准库里面的 fmt 包,此包主要是用来往屏幕输入输出字符串,格式化字符串。

fmt.Println("HelloWorld")即为输出 HelloWorld 字符串。

(将鼠标在代码上悬停一秒,可看到关于此代码(函数)的文档,下面的链接将会跳转到pkg.go.dev,能看到整个包的文档,可在其中挑选所需函数。

变量的声明

var name = "abc"此方式声明变量一般可自动推导变量类型,若有需要,可明示变量类型,如var b,c int = 1 , 2

另一种方式name := float32(e); 常量声明:const d = 10000(也可根据上下文自动推导类型,若要确定类型,则可用const e string = "constant"

if else语句

if后的判断无须添加括号,并且后面的执行内容前后必须又大括号包括进去。

switch的判别与if else的判别一致(无须加括号),须注意的是case之间无须使用break分隔,默认只执行第一个case。

循环

Go语言中只有for循环,判别语句以及后续内容与if else语句相同。

数组 切片

数组:var a[5]int,长度固定,使用少。

切片:s := make([]string, 3),可使用append追加元素,可由len()获取长度,也提供了计算容量的方法cap()。切片可索引。

map(集合)数据结构

定义:m := make(map[string]int) delete()函数用于删除集合的元素,参数为map和其对应的key。map的输出为一个偏随机的输出。

range(语法范围)

对于一个切片(slice) 或者 集合(map) 等,可用range快速遍历。

对于数组,range会返回两个值,第一个是索引,第二个是对应位置的值。

对于集合(map),range的第一个值是 key ,第二个值是 value 。

函数

可返回多个值:return a,b

函数类型后置:

func add(a int, b int) int {
   return a + b
}

指针

一个指针变量指向了一个值的内存地址, 与C语言用法相同。

结构体

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

type user struct {
   name     string
   passward string
}

结构体的方法

在建立了如上结构体后:

func (u user) checkPassword(passward string) bool  {
   return u.passward == passward
}

该函数便变成一个类成员函数。

错误处理

如下示:

func findUser(users []user, name string) (v *user, err error) {
   for _, u := range users {
      if u.name == name {
         return &u, nil
      }
   }
   return nil, errors.New("not found")
}

字符串操作

len()函数可以返回一个字符串中字节数目;索引操作s[i]返回第i个字节的字节值,i必须满足0<=i<len(s)条件约束,超出则会导致panic异常。

子字符串操作s[i : j]基于原始的s字符串的第i个字节开始到第j个字节(并不包含j本身)生成一个新字符串。生成的新字符串将包含j-i个字节。

+操作符将两个字符串连构造成一个新字符串(与C++相同);

+外,== < +=等均与C++相似。

字符串是不可修改的,因此尝试修改字符串内部数据的操作也是被禁止的。 字符串格式化

fmt.Println(s,n)可打印任意字符串。

fmt.Printf()类似于C语言中的printf(),可用printf("%v")打印任意类型的变量。(用"%+v"得到较详细的结构,用"%-v"进一步详细。

JSON处理

对于一个结构体(结构体中每个字段的第一个字段为大写),那么该结构体便可用json.Marshal(name)序列化。(输出时用string类型转换才能打印出字符串,否则只能打印出16进制类型的编码)

序列化的字段也可以用json.Unmarshal来反序列化到一个空的变量里面。

时间处理:

time.Now()等。

数字解析:

"strconv"包中相关内容

进程信息:

os.Args,os.Getenv("PATH"),os.Setenv("AA","BB"),exe.Command("grep","127.0.0.1","/etc/hosts").CombinedOutput()等。