Go语言基础 | 青训营笔记

141 阅读4分钟

基础语法

hello world

package main //程序入口文件

import "fmt" //标准库文件,用于输入输出格式化字符串

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

变量

常见变量类型:字符串、整数、浮点型、布尔型

两种方法声明变量

1、var 变量名 = 值

可自动推导变量类型,也可以自己写出类型

var a = "abc"
var b,c int =1,2

2、变量名 := 值

f := float32(e)

常量

把var改成const即可

const s string = "constant"

注意go语言中常量会根据上下文自动定义类型

if else

类似c/c++,要注意if后面判断语句不用括号

if 7%2 == 0 {
    fmt.Println("..")
}
else {
    fmt.Println("...")
}

循环

只有for循环

一、死循环

for{
    fat.Println("")
    break
}

二、经典循环

for j := 7; j < 9; j++{
    fmt.Println("")
}

可以用continue来继续循环,也可以用break来跳出循环

switch

类似c/c++,变量名不需要括号

注意:go语言里面switch不需要在每个case后面加break

a := 2
switch a{
case 1:
    fmt.Println("1")
case 2:
    fmt.Println("2")
default:
    fmt.Println("other")
}

可以使用任意变量类型,如字符串、结构体等

也可以取代if else语句,在switch后面不加任何变量而在case后面加分支

t := time.Now()
switch {
case t.Hour() < 12:
    fmt.Println("before noon")
default:
    fmt.Println("after noon")
}

数组

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

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

并不常用,更多使用切片

切片

可变长度的数组,可在任意时刻更改长度

s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"

输出切片长度

fmt.Println(len(s))

可使用append追加元素

注意:append必须将新数组赋值给原数组

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

可使用copy拷贝数据

c := make([]string, len(s))
copy(c, s)

输出切片的值

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]

map

哈希

m := make(map[string]int)

string为key,int为value

创建与删除

m["one"] = 1
delete(m, "one")

判断key值是否有元素

r, ok := m["unknow"]
fmt.Println(r, ok)// 0 false

遍历map时会按随机顺序遍历

range

用于快速遍历

两个值:一个索引,一个对应位置的值

nums := []int{2, 3, 4}
for i, num :=rage nums{
    fmt.Println("index:", i, "num:", num)
}
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
    fmt.Println{k, v}
}

函数

变量类型后置,函数支持返回多个值,一般业务逻辑中第一个值返回结果、第二个值返回错误信息

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

func exists(m map[string]string, k string) (v string, ok bool) {
    v, ok :=m[k]
    return v, ok
}

指针

对传入的参数进行修改

func add2(n *int) {
    *n += 2
}

结构体

带类型的字段的集合

type user struct {
    name string
    password string
}

下面四种方法都可以初始化结构体,没有定义时会初始化为空值

func main(){
    a := user{name: "wang", password: "1024")
    b := user{"wang", "1024")
    c := user{name: "wang"}
    c.password = "1024"
    var d user
    d.name = "wang"
    d.password = "1024"
}

指针也可以对结构体实现修改

结构体方法

go语言可以给结构体自定义方法,类似于成员函数,这样可以用结构体直接调用函数

func(u user) checkPassword(password string) bool {
    return u,password == password
}
fmt.Println(a.checkPassword("2048"))

实现结构体方法时也可以带指针,这样可以对结构体进行修改

错误处理

可以在函数的返回值类型里面加error,这就代表这个函数可能会返回错误,在函数实现时需要return两个值。

在调用函数时也需要两个值来调用,调用后需要判断error是否存在

func finduser (users []user, name string) (v *user, err error){
    for _, u := range users{
        ...
        return &u, nil
    }
    return nil, erroes.New("not found")//出现错误时返回
}

u, err := finduser([]user{{"wang", "1024"}}, "wang")

字符串操作

判断一个字符串中是否包含另一个字符串

string.Contains(a, "ll")

字符串计数

string.Count(a, "l")

查找某个字符串的位置

string.Index(a, "ll")

连接多个字符串

string.Join([]string{"he","llo"}, "-")//he-llo

重复多个字符串

string.Re("hello", 2) //hellohello

获取字符串长度

len(a)

字符串格式化

打印多个变量并且换行

fmt.Println()

也可以使用Printf

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

在go语言中对于任意变量都可以使用%v来打印,而不需要区分类型

使用%+v可以得到详细结构,%#v则是更加详细

利用%.2f可以控制打印浮点数的小数点位数

json处理

只需要保证结构体内所有字段的第一个字母是大写,就可以使用json.Marshal进行数列化,数列化后会成为一个数组,在输出时需要用到强制类型转换

buf, err := json.Marshal(a)

也可以使用json.Unmarshal进行反数列化

err = json.Unmarshal(buf, &b)

时间处理

最常用的时间处理

now := time.Now() //快速获取当前时间

时间戳

fmt.Println(now.Unix())

数字解析

解析字符串

f, _ := strconv.ParseFloat("1.234", 64) // 字符串,精度
fmt.Println(f) //1.234

n, _ :=strconv.ParseInt("111", 10, 64) // 字符串,进制,精度
fmt.Println(n) //111

n, _ := strconv.Atoi("123") // 快速将字符串转为十进制,也可以将数字转为字符串
fmt.Println(n)

进程信息

获取进程信息

fmt.Println(os.Args) //获取运行时命令行的参数

fmt.Println(os.Getenv("PATH")) //获取路径写入环境变量

buf, err := exec.Command("grep", "127.0.0.1", "/etc/bosts").CombinedOutput() //快速启动子进程并且获取输入输出