Go基础 | 青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 N 天
Go基础
Go语言的特点
- 高性能、搞并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
安装Golang环境的地址
- go.dev/
- studygolang.com/dl(国内镜像地址)
- goproxy.cn
基础语法
变量的定义
- 第一种方法(可以指定类型,与我们常用的java等语言不同,先指定变量名再指定变量类型)
var a = 12
// 指定类型
var a int = 32;
- 第二种方法
f := float32(1.2)
- 第三种方法(定义常量)
const s = "ssss"
if else
判断里面没有括号
if x == 0 {
fmt.Println("sss")
} else {
fmt.Println("hhh")
}
循环(只有for 循环)
同样没有使用括号
for i := 1; i < 10; i++ {
fmt.Pritln(i)
}
有continue和break来跳出循环
switch
这个switch更加强大,变量不仅仅只可以是数据,也可以是字符串等其他变量
a := 1
swatch a {
case 1 :
fmt.Println("111")
default:
fmt.Println("others")
}
// 也可以在switch后面不添加变量
t := time.Now()
swatch {
case t.Hour() <12 :
fmt.Println("am")
default:
fmt.Println("pm")
}
数组、切片和map
- 数组
var a [5] int
b := [5] int {1,2,3,4,5}
- 切片 (长度可变,相当于Java里面的列表)
s := make([] string, 3)
s[1] = "a"
// 使用append必须将结果返回给原数组
s = append(s, "b")
s = append(s, "c", "d")
len(s) // 4
s[1:3] // [b, c] 左闭右开
- map
m := make(map[string[] int)
m["one"] = 1
len(m) // 1
delete(m, "one")
range (相当于python里面的枚举enumerate)
nums := []int{1, 2, 3}
for i, num := range nums {
sum += num
}
// 遍历map
for k, v := range m {
}
函数
func add (a int, b int) int {
return a + b
}
指针
这里的指针与学C语言的指针类似,指向这边变量所存储的地址,当我们想要修改一个变量的值并作为参数传入一个方法的时候,需要使用指针,即将该参数的地址传入,这样才会改变该参数的值。
// 无效
func add1(n int) {
n += 2
}
// 有效
func add2(n *int) {
*n += 2
}
add1(n)
add2(&n)
结构体
type user struct {
name string
pass string
}
a = user("ww", "ss")
a = user(name: "ww", pass: "ss")
错误处理
不同于Java、python等异常处理,Go的错误处理通常是在函数的返回值里面给出错误
type user struct {
name string
pass string
}
func findUser(users [], name string) (v *user, err error) {
for _, user := range users {
if user.name == name {
return &user, nil
}
}
return nil, errors.New("not found")
}
字符串操作
a := "hello"
strings.Contains(a, "ll") // true
strings.Count(a, "l") // 2
strings.HasPrefix(a, "he") // true
strings.HasSuffix(a, "lo") // true
strings.Index(a, "ll") // 2
strings.Join([] string{"hel", "lo"}, "-") // hel-lo
strings.Repeat(a, 2) // hellohello
strings.Replace(a, "e, "E", -1) // hEllo
strings.Split("a-b-c", "-") // [a, b, c]
strings.ToUpper(a) // HELLO
strings.ToLower(a) // hello
len(a) // 5
b := "你好"
len(b) // 6
字符串格式化
%v 可以用于指定任意类型,%+v 包括字段类型,%#v 包括结构体信息
s := "hello"
p := point{1, 2}
fmt.Printf("s=%v\n", p) // p={1 2}
fmt.Printf("s=%+v\n", p) // p={x:1 y:2}
fmt.Printf("s=%#v\n", p) // p=main.point{x:1, y:2}
json处理
- 将json序列化成字符串
buf, err = json.Marshal(a) // a json格式的结构体对象
- 将字符串反序列化成结构体对象
var b User
err = json.Unmarshal(buf, &b) // **注意需要使用指针,因为我们要修改变量b**
时间解析
- 获取时间
now := time.Now()
t := time.Date(2023, 1, 15, 20, 41, 34, 0, time.UTC)
- 将时间格式化成你想要的字符串
t.Format("2006-01-01 10:10:10")
- 字符串转时间
t3, err = time.Parse("2006-01-01 10:10:10")
- 时间转时间戳
now.Unix() // now是一个时间对象
now.UnixNano() //纳秒时间戳
- 时间的加减
now.Add(time.Hour)
now.Sub(time.Hour)