1 Go语言基础语法 | 青训营笔记

72 阅读4分钟

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

2.1 go基础语法 helloworld

程序入口包 入口文件

package main 

导入标准库format包 输入输出 格式化字符串

import{
"fmt"
}

main函数中调用~输出 hello world

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

运行

go run helloworld.go 

编译成二进制

go build helloworld.go

编译完后使用./hellowold运行

将鼠标悬浮在fmt函数上1s能看到函数文档

链接整个包的在线文档

01-hello

package main

import (
	"fmt"
)

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

2.2 变量

变量类型

字符串、整型、布尔型浮点型

go语言字符串内置,可直接通过“+”号拼接

运算优先级于C类似

变量声明

第一种

var name (type)= value 

可自动推导变量类型 也可显式说明

第二种

name := value

常量 可根据上下文自动确定类型

var改为const

package main

import (
	"fmt"
	"math"
)

func main() {

	var a = "initial"

	var b, c int = 1, 2

	var d = true

	var e float64

	f := float32(e)

	g := a + "foo"
	fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
	fmt.Println(g)                // initialapple

	const s string = "constant"
	const h = 500000000
	const i = 3e20 / h
	fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}

2.3 if else

和c类似 没有小括号

条件后跟大括号 不能像c写在同一行

2.4 循环

没有(do) while循环 只有for循环

三段条件可省略任意一段

可用continue继续循环

break跳出循环

可以使用 for {} 来做死循环;

2.5 switch

变量名不需要括号

和c不同 不用加break

执行完一个条件后即跳转到末尾

可使用任意类型

2.6 数组

具有编号,长度固定的元素序列

var name [number]type

06-array

package main

import "fmt"

func main() {

	var a [5]int
	a[4] = 100
	fmt.Println("get:", a[2])
	fmt.Println("len:", len(a))

	b := [5]int{1, 2, 3, 4, 5}
	fmt.Println(b)

	var twoD [2][3]int
	for i := 0; i < 2; i++ {
		for j := 0; j < 3; j++ {
			twoD[i][j] = i + j
		}
	}
	fmt.Println("2d: ", twoD)
}

2.7切片

更常用 任意时刻可更改长度的数组

s :=make([]string,3)

可用append追加元素

s = append(s, "d")

用make创建slyce也可直接赋予长度

用copy在两个slyce间拷贝数据

可像python做切片操作

07-slice

package main

import "fmt"

func main() {

	s := make([]string, 3)
	s[0] = "a"
	s[1] = "b"
	s[2] = "c"
	fmt.Println("get:", s[2])   // c
	fmt.Println("len:", len(s)) // 3

	s = append(s, "d")
	s = append(s, "e", "f")
	fmt.Println(s) // [a b c d e f]

	c := make([]string, len(s))
	copy(c, s)
	fmt.Println(c) // [a b c d e f]

	fmt.Println(s[2:5]) // [c d e]
	fmt.Println(s[:5])  // [a b c d e]
	fmt.Println(s[2:])  // [c d e f]

	good := []string{"g", "o", "o", "d"}
	fmt.Println(good) // [g o o d]
}

2.8map

哈希/字典

key的类型value的类型

方括号语法写入/读取K-V对

delete删除K-V对

读取时加ok来判断K-V对是否存在

随机顺序输出

2.9 range

range来快速遍历

对于数组返回两个值 索引 值

可用下划线忽略索引

map返回key value

2.10 函数

变量类型后置

返回第一个结果 第二个错误信息

2.11 指针

主要对传入参数进行修改

函数参数为指针时

调用时加&符号才能编译通过

2.12 结构体

带类型字段的结合

.字段名字来读取写入结构体内容

也能作为函数参数 也可传指针形式

2.13 结构体方法

类似 类成员函数

也可带指针 就能对结构体进行修改

2.14 错误处理

使用单独返回值传递错误信息

正确返回原本值,nil

错误返回nil,errors.New("NOT FOUND")

调用完判断err是否存在

进行处理打印阈值 跳出 返回函数

只有没有err才能真正取返回值 否则出现空指0错误

2.15 字符串操作

strings包中的字符串工具函数 len(b)一个中文可能对应多个字符

15-string

package main

import (
	"fmt"
	"strings"
)

func main() {
	a := "hello"
	fmt.Println(strings.Contains(a, "ll"))                // true
	fmt.Println(strings.Count(a, "l"))                    // 2
	fmt.Println(strings.HasPrefix(a, "he"))               // true
	fmt.Println(strings.HasSuffix(a, "llo"))              // true
	fmt.Println(strings.Index(a, "ll"))                   // 2
	fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
	fmt.Println(strings.Repeat(a, 2))                     // hellohello
	fmt.Println(strings.Replace(a, "e", "E", -1))         // hEllo
	fmt.Println(strings.Split("a-b-c", "-"))              // [a b c]
	fmt.Println(strings.ToLower(a))                       // hello
	fmt.Println(strings.ToUpper(a))                       // HELLO
	fmt.Println(len(a))                                   // 5
	b := "你好"
	fmt.Println(len(b)) // 6
}

2.16 字符串格式化

fmt.Println(s, n)打印多个变量并换行

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

%v任意类型变量 值

%d数字 %s字符串

%+v得更详细的结果 字段名 值

%#v进一步详细 构造类型名称 字段名 值

%.2f保留两位小数浮点数

2.17 JSON处理

公开字段首字母大写

json.Marshal(a)序列化成buf数组 可理解为字符串

直接打印为16进制数 需要强制类型转换

json.unmarshal反序列化到空变量里

序列化后大写字母开头 在字段结构体后加json的tag修改成小写

2.18 时间处理

time.Now()最常用 快速获取当前时间

time.Date()构造带时区的时间

.Sub作减法得到时间段

.Format格式化到时间字符串

.Parse时间字符串解析成时间

time.Unix和某些系统交互时获取时间戳

2.19 数字解析

strconv包

.ParseInt(字符串, 进制, 精度) .ParseFloat解析字符串

.Atoi快速将十进制字符串转为数字

.Rtoa数字转字符串

输入不合法返回错误

2.20 进程信息

os.Args进程执行时命令行参数

路径+名字 参数

os.Getenv os.Setenv获取写入环境变量

exec.Commond快速启动子进程并获取其输入输出