这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
没有接触过Go, 第一堂课的基础语法讲解快到飞起😢😢😢。
不过如果有其他语言的基础的话理解起来会很快。
学习Go的路线 Go 语言学习路线图 - 飞书云文档 (feishu.cn)
Go语言圣经 前言 · Go语言圣经 (studygolang.com)
基础语法部分
变量&常量
var a = 1
b := 2
const p = 3.14
条件语句&循环语句
if else语句
if后的条件语句没有括号
if 7 % 2 == 0 {
fmt.Println("lalalala")
} else {
fmt.Println("balabala")
}
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
只有 for 循环,没有 while循环或者do while循环
for j := 0; j < 9; j++ {
fmt.Println(j)
}
for 后面的条件都可以省略
switch case语句
每一个case不用加break
switch a {
case 1:
fmt.Println("1")
case 2:
fmt.Println("2")
default:
fmt.Println("default")
}
case 的条件也更强大
数组
变量类型是后置的
var a [5]int
a[4] = 100
fmt.Println(a[4],len(a))
切片
可变长度的数组(更常用)
使用 make 创建,append 添加
s:= make([]string,3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get",s[2])
s = append(s,"d","e","f")
fmt.Println(s[2:5])
s[2:5] 不包括 s[5]
Map
m:= make(map[string]int) //创建
m["one"] = 1 //赋值
m["two"] = 2
m["three"] = 3
fmt.Println(m)
fmt.Println(len(m))
delete(m,"one") //删除
m2 := map[string]int{"four":4,"five":5} //另一种创建方式
fmt.Println(m2)
函数
用func 定义
后置变量类型,返回值在最后,且可以返回多个值,第一个值为真正的 value,第二个为错误信息
这一点和其他的很多语言都不同
因此很多Go的函数调用后总是要检查err != nil以确定有没有错误
func add(a int, b int) int {
return a + b
}
func add(a ,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
}
指针
Go中指针作用有限,不像 C 中那么复杂
主要用来引用传递:想要真正改变传入函数中的参数的值
func addptr(n *int) {
*n += 2
}
func add(n int) {
n += 2
}
func main() {
n := 5
add(n)
addptr(&n)
fmt.Println(n)
}
调用add不会改变main中n的值,但是调用addptr会改变
结构体
type user struct {
name string
password string
}
a := user{name: "zhangsan", password:"1111"}
b := user{"lisi", "2222"}
c := user{"wangwu"}
c.password = "3333"
可以使用.对字段进行访问
可以使用结构体指针,这样可以对结构体进行修改
错误处理
可以在函数返回值里面加入一个 err error 变量,return 两个值
func add(a int, b int) (c int, err error) {
c = a + b
return c, nil
}
字符串操作和字符串格式化
导入需要的包
import(
"fmt"
"string"
)
具体函数见标准库Standard library - Go Packages
字符串格式化与C语言差不多
JSON 操作
导入需要的包
import(
"fmt"
"encoding/json"
)
对于结构体,只要保证每一个字段的第一个字母是大写的,就可以用 json.Marshal(结构体变量)进行序列化
type user struct {
Name string
Age int 'json:"age"'
Password string
}
也可以在字段后面加上'json:"小写字段"'
a := user{Name: "zhangsan", Age: "20", Password:"1111"}
buf, err := json.Marshal(a)
fmt.Println(string(buf))
var b user
err = json.Unmarshal(buf,&b)
时间处理
import(
"fmt"
"time"
)
tNow = time.Now() //现在的时间
t := time.Date(2022,3,27,1,25,36,0,time.UTC)
fmt.Println(t.Year(),t.Month(),t.Format("2002-01-02 11:11:11"))
t1, err := time.Parse("2023-01-14 20:34:10")
time.Unix() //时间戳
数字解析
导包
import(
"fmt"
"strconv"
)
几个例子
f, _ = strconv.parseFloat("1.2222",64)
n, _ = strconv.parseInt("111", 10, 64)
n2, _ = strconv.parseInt("0x1000", 10, 64)
s, err = strconv.Atoi("100")
进程信息
import(
"fmt"
"os"
"os/esec"
)
具体用法自行查看官方文档 (我懒得写)
os.Args
os.Getnv()
os.Setnv()
exec.Command()
实战项目分析
Go 语言的实战案例 | 青训营笔记 - 掘金 (juejin.cn)
其他链接
📚 伴学笔记创作活动来袭 | 第五届字节跳动青训营 - 掘金 (juejin.cn)
【后端专场 学习资料一】第五届字节跳动青训营 - 掘金 (juejin.cn)
走进 Go 语言基础语言 - 掘金 (juejin.cn)