Go 语言入门指南:基础语法和常用特性解析|青训营

57 阅读5分钟

走进Go语言基础语法

优点:

  • 高并发、高性能
  • 语法简单
  • 标准库多
  • 完善的工具链
  • 静态链接
  • 快速编译
  • 跨平台
  • 垃圾回收

基础语法

  • 后面不用 ; 结束语句
  • 函数原生支持返回多个值。在实际的业务逻辑代码里面几乎所有的函数都返回两个值,第一个是真正的返回结果,第二个值是一个错误信息
  • 变量类型是后置的
  • 函数包里面函数名好像都是大写开头捏
  • 赋值可以用=,新建变量用:=

变量声明

  • var name = value
  • name := value
  • 变量性质写在变量名后面

常量声明

把var改成const即可

if else 语句

if 后面没有括号,后面一定要有{}

循环

只有for循环

  • 可以什么都不写变成死循环
  • 普通循环也不用括号
  • 可以用break和continue
  • for的条件不需要三个一定都有

Switch 语句

  • 不用写break
  • 可以取代部分 if else 的功能,可以在 switch 后面不加任何的变量,然后在 case 里面写条件分支

数组和切片

// 初始化
s := make([]string, 3)
//取切片中的一部分(也是从0开始计数)
fmt.Println(s[2:5])
// s[:5]和s[2:]以此类推
//增加元素
s = append(s,"d")
  • 数组是固定长度的
  • 切片用 append 添加元素(要用赋值给元素组的方法)
  • 不支持负数指引

map/hash

//创建,例子内string为key的类型,int为value的类型
m := make(map[string]int)
//取key的value得用 m["key"](以上面例子为例)
//可以用OK确认map里面有没有这个key
r, ok :=m["unkonwn"]
//删除
delete(m,"one")

map遍历是没有顺序的!

range

对于 slice 或 map ,我们可以用 range 来快速遍历。 range 遍历的时候,

  • 对于数组会返回两个值,第一个是key,第二个是value。
  • 如果我们不需要key的话,我们可以用下划线来忽略。
nums := []int{1,2,3}
// usage one
for i,num := range nums{
// i is key, num is value
}
//usage two
for k:= range nums{
// k is key
}

指针

主要用途就是对传入的参数进行修改

  • 传入函数的参数实际上是拷贝,在拷贝上修改不影响原本(相当于没用
  • 要起作用得写成指针类型,即在type前面和变量名前面都要加*
  • 为了类型匹配,调用函数的时候在变量名前面加&

结构体

示例:

//创建一个叫user的type
type user struct{
    name string
    password string
}

初始化方式

用结构体的名称去初始化一个结构体变量

  1. 构造的时候需要传入每个字段的初始值。
  2. 用这种键值对的方式去指定初始值(这样可以只对一部分字段进行初始化)
  3. 指针
  4. 先 var, 然后用名字+.属性名的方式设置(不推荐)

类成员函数

在函数名前面加括号表示类

示例:

这里bool是返回类型,函数返回类型可以多个,用','隔开

fun (u user) check(password string) bool{
    return u.passowrd=password
}

同样,只有带指针才能对结构体进行修改,要放在结构体类型那里,如上为user前面加' '

错误处理

  • 要import errors
  • 变量类型为error
  • 出现错误返回nil和error,正常返回原本结果和nil(对于返回一个值和一个error的函数来说,剩下以此类推)

字符串操作化

  • 要import strings
  • contains 判断一个字符串里面是否有包含另一个字符串
  • count 字符串计数
  • index 查找某个字符串的位置
  • join 连接多个字符串
  • repeat 重复多个字符串
  • replace 替换字符串。

字符串格式化

  • 在fmt中有相关方法
  • 用%v 可以打印任意类型变量
  • %+v 打印详细结果,%#v 则更详细。
  • 可以用来精确限制打印几位数的小数(比如打印小数点后两位的用%.2f\n)

例子:

fmt.Printf("s=%v\n",s)
fmt.Printf("p=%+v\n",p)

JSON 处理

  • 要import encoding/json
  • 对于一个结构体,只要保证每个字段的第一个字母是大写,也就是是公开字段。那么这个结构体就能用 JSON.Marshaler 去序列化,变成一个 JSON 的字符串
  • 序列化之后的字符串能用 JSON.Unmarshaler 去反序列化到一个空的变量里。这样默认序列化出来的字符串,风格是大写字母开头,而不是下划线。我们可以在后面用 json tag 等语法来去修改输出 JSON 结果里面的字段名。
  • 可以用在结构体属性定义后面加 json: "newName"来使输出JSON结果内这个属性字段名为newName
  • 用Print打印JSON字符串要用先化为string,可以用string("JSON")来,这里的JSON代指JSON字符串

时间处理

  • time.now() 获取当前时间
  • time.Date 构造一个带时区的时间
  • . Sub 去对两个时间进行减法,得到一个时间段。时间段又可以去得到它有多少小时,多少分钟、多少秒。
  • 用 .UNIX 来获取时间戳。返回的都是距离UTC时间:1970年1月1日0点0分0秒的秒数。
  • time.Format改格式。不是用"yy mm dd"的格式而是用一个固定的时间(懒得打了有空再搜吧)
  • time.Parse把时间字符串转换为Time,时区是UTC时区。

数字解析

  • import strconv
  • 用 ParseInt 或者 ParseFloat 来解析一个字符串。
  • 用 Atoi 把一个十进制字符串转成数字。可以用 itoA 把数字转成字符串。
  • 如果输入不合法,那么这些函数都会返回error
n,_ :=strconv.ParseInt("111",10,64)

进程信息

  • import os 和 os/exec
  • os.Args 来得到程序执行的时候的指定的命令行参数。比如我们编译的一个 二进制文件,command。 后面接 abcd 来启动,输出就是 os.Args 会是一个长度为 5 的 slice ,第一个成员代表二进制自身的名字。
  • 我们可以用 os.Getenv来读取环境变量。用os.Setenv来设置环境变量
  • 可以用exce.Command()来执行语句返回一个cmd对象