这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
笔记,还是自己的好!
Day1
走进 Go 语言基础语言
本节课作为本合辑课程的开篇之课,将为大家详细讲解 Go 语言的相关背景知识。从开发环境、基础语法和标准库出发,协助同学轻松入门。
简介
特点
高性能、高并发;语法简单、学习曲线平缓;丰富的标准库;完善的工具链;静态链接;快速编译;跨平台;垃圾回收。
在用公司
字节、谷歌、腾讯、Meta、美团、七牛云、滴滴、哔哩哔哩、百度、PingCAP.
package main
import (
"fmt"
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir(".")))
fmt.Println("Listening...")
http.ListenAndServe(":8080", nil)
fmt.Println("Waiting to serve") // 什么时候执行?
}
curl 127.0.0.1:8080
<pre>
<a href="http.go">http.go</a>
</pre>
入门
安装参考官网、中国镜像、GoModProxy。
if else switch
msg := ""
// num 的作用域为if...else...。
if num := 2; num < 0 {
msg = "不会打印本消息"
}else{
msg = "打印本消息"
}
fmt.Println(msg)
//fmt.Println(num)
// 编译错误
// switch会自动break,case可以合并
// 甚至可以不带变量名num,此时跟多个if一样,不再是简单的枚举。
switch num {
case 0:
//doSomething()
case 1, 2:
// doOtherthing()
default:
// doDefaultthing()
}
for
没有while、do while。
// 其他语言
/*
while(condition){
doSomething();
}
*/
// Golang
for condition {
doSomething()
}
// 其他语言
/*
do {
doSomething();
}while(condition);
*/
// Golang
for {
doSomething()
if !condition {
break
}
}
切片slice
/*
// 动态数组
type slice struct {
array unsafe.Pointer //指针
len int //长度
cap int //容量
}
*/
s := make([]int, 3) //必须指定len,返回值为类型。(new返回指针。)
s = append(s, 1)
s = append(s, 2, 3)
s = append(s, []int{4,5,6}...)
fmt.Println(s)
// s: [0 0 0 1 2 3 4 5 6]
c := make([]int, 6)
copy(c, s) // 能复制多少就复制多少,不报错
fmt.Println(c)
// c: [0 0 0 1 2 3]
映射map
m := map[string]int{"one": 1, "two": 2}
val, ok := -1, true
val, ok = m["unknwon"]
fmt.Println(val, ok)
// 0 false。返回"零值"0并覆盖val
delete(m, "one")
range
for index, value := range slice {
}
for key [, value] := range map
}
结构体方法
type user struct {
name string
pwd string
}
// (u user)是类型,不会改变u.pwd
// just like func setpwd1(u user, pwd string)
func (u user) setpwd1(pwd string) {
u.pwd = pwd
}
// (u *user)是指针,会改变u.pwd
// just like func setpwd2(u *user, pwd string)
func (u *user) setpwd2(pwd string) {
u.pwd = pwd // 与下面等价,go会预处理。
//(*u).pwd = pwd
}
u := user{name:"zhangsan", pwd: "123456"}
u.setpwd1("654321")
fmt.Println(u.pwd)
// 123456
u.setpwd2("654321")
fmt.Println(u.pwd)
// 654321
错误处理
import "errors"
err := errors.New("Error Msg")
if err != nil {
return
}
字符串
import "strings"
strings.xxx, xxx in :
Contains
Count
HasPrefix
Index
Join
Repeat
Split
ToLower
// 输出格式: "%[+#]v"
json
import "encoding/json"
// json.Marshal -> json.MarshalIndent(obj, "", "\t") 带缩进
// json.Unmarshal
时间
2006-01-02 15:04:05,这个时间,要背?
Go1.20要新增的3个常量?
DateTime = "2006-01-02 15:04:05" DateOnly = "2006-01-02" TimeOnly = "15:04:05"
import "time"
time.xxx, xxx in :
Now().Unix()
Date
Year
Sub().Minutes()
Format
Parse()将字符串转成时间
func Parse
func Parse(layout, value string) (Time, error)
Parse解析一个格式化的时间字符串并返回它代表的时间。layout定义了参考时间Mon Jan 2 15:04:05 -0700 MST 2006在输入格式下的字符串表示,作为输入的格式的示例。同样的格式规则会被用于输入字符串。
t, e := time.Parse("2006-01-02-02TTTAny15:04:05", "2022-03-27-27TTTAny01:25:36")
if e != nil {
return
}
fmt.Println(t)
// 2022-03-27 01:25:36 +0000 UTC
strconv
ParseType(str, srcBase, retTypeLen)
Atoi(str) -> int
进程信息
import (
"os"
"os/exec"
)
os.Args
os.Getenv("PATH")
os.Setenv(key, value)
exec.Command("grep", "127.0.0.1", "/etc/hosts").CombinedOutput()
// CombinedOutput: 执行命令并返回标准输出和错误输出合并的切片。
/*
$ grep '127.0.0.1' /etc/hosts
127.0.0.1 localhost
127.0.0.1 kubernetes.docker.internal
*/
实战
猜数字、在线词典、Socks5代理。