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

350 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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)