Go语言基础****
· 简介****
o RPC框架
§ remote procedure call远过程调用
·
· 入门****
o 开发环境
§ 安装golang
· go.dev/
§ 配置集成开发环境
· 编译器、IDE
o VScode、Goland(收费、教育优惠)
§ VS记得安装go语言插件
· IDE:integrated development environment集成开发环境,用于提供程序开发环境的应用程序
o 代码编辑器
o 编译器
o 调制器
o 图形用户界面
· 集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套
· 练习可以用gitpod
o 短链接:hi-hi.cn/gitpod
o 基础语法
§ 1.Hello World
· package mainimport ( "fmt")func main() { fmt.Println"hello world")}
o fmt:format格式化字符串
§ 2.变量类型
· 字符串
o 内置
§ 直接 + “foo”,用加号连接
· 浮点型
· 布尔型
· 整数型
· 定义变量格式
o var 啥 = 值
o 啥 := 值
· 常量无需定义,会根据上下文自动判断
o const
§ 3.if else
· package mainimport "fmt"func main() {i := 1for {fmt.Println("loop")break}for j := 7; j < 9; j++ {fmt.Println(j)}for n := 0; n < 5; n++ {if n%2 == 0 {continue}fmt.Println(n)}for i <= 3 {fmt.Println(i)i = i + 1}}
o 输出结果
§ loop7813123
o continue继续循环
o break终止循环
§ 4.循环
· C语言多了while和do while
· 只有for死循环
o package mainimport "fmt"func main() {if 7%2 == 0 {fmt.Println("7 is even")} else {fmt.Println("7 is odd")}if 8%4 == 0 {fmt.Println("8 is divisible by 4")}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")}}
§ 输出结果
· 7 is odd8 is divisible by 49 has 1 digit
§ 5.switch
· 比起c语言,一是不用给变量打引号;二是不用写break,他不会把每个case跑完再去下面一步,二是跑完一个case就运行下面一步
· 简洁清晰
o package mainimport ("fmt""time")func main() {a := 2switch a {case 1:fmt.Println("one")case 2:fmt.Println("two")case 3:fmt.Println("three")case 4, 5:fmt.Println("four or five")default:fmt.Println("other")}t := time.Now()switch {case t.Hour() < 12:fmt.Println("It's before noon")default:fmt.Println("It's after noon")}}
§ 结果:twoIt's before noon
§ 6.数组
· 一个具有编号且长度固定的元素序列
o package mainimport "fmt"func main() {var a [5]inta[4] = 100fmt.Println("get:", a[2])fmt.Println("len:", len(a))b := [5]int{1, 2, 3, 4, 5}fmt.Println(b)var twoD [2][3]intfor i := 0; i < 2; i++ {for j := 0; j < 3; j++ {twoD[i][j] = i + j}}fmt.Println("2d: ", twoD)}
§ get: 0len: 5[1 2 3 4 5]2d: [[0 1 2] [1 2 3]]
§ 7.切片
· 可变长度的数组
o make创造,append追加元素(记得先要把切片内容给append存储赋值)
o package mainimport "fmt"func main() {s := make([]string, 3)s[0] = "a"s[1] = "b"s[2] = "c"fmt.Println("get:", s[2]) // cfmt.Println("len:", len(s)) // 3s = append(s, "d")s = append(s, "e", "f")fmt.Println(s) // [a b c d e f]c := make([]string, len(s))copy(c, s)fmt.Println(c) // [a b c d e f]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]good := []string{"g", "o", "o", "d"}fmt.Println(good) // [g o o d]}
§ get: clen: 3[a b c d e f][a b c d e f][c d e][a b c d e][c d e f][g o o d]
§ 8.map
· 其他语言叫哈希or字典
· make创建
· 两个类型
o value
§ int
o key
§ string
· []写入kv对(键值对);delete删除
· 读取时加一个ok看map中是否有key存在
· 顺序是随机的
§ 9.range
· 数组一是返回索引;二是返回对应位置的值
o 子主题
§ index: 0 num: 29b Ba Akey bkey a
§ 10.函数
· 返回第一个值是真实值,第二个是错误信息
o package mainimport "fmt"func add(a int, b int) int {return a + b}func add2(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}func main() {res := add(1, 2)fmt.Println(res) // 3v, ok := exists(map[string]string{"a": "A"}, "a")fmt.Println(v, ok) // A True}
§ 3A true
· 注意变量后置
o v=value,ok=是否存在
§ 11.指针
· 用处:对传入函数进行修改
· 注意:*&符号
o package mainimport "fmt"func add2(n int) {n += 2}func add2ptr(n *int) {*n += 2}func main() {n := 5add2(n)fmt.Println(n) // 5add2ptr(&n)fmt.Println(n) // 7}
§ 57
§ 12.结构体
· 带类型的字段的集合
· 用结构体名称name,password初始化结构体变量,传入每个字段初始值,默认是空值字符串
· 用指针容易修改
§ 13.结构体方法
· 其他语言:类成员函数
o package mainimport "fmt"type user struct {name stringpassword string}func (u user) checkPassword(password string) bool {return u.password == password}func (u *user) resetPassword(password string) {u.password = password}func main() {a := user{name: "wang", password: "1024"}a.resetPassword("2048")fmt.Println(a.checkPassword("2048")) // true}
§ func (u user)不带指针
§ func (u *user)带指针
§ 输出结果:true
· 通过func和()将user从普通函数变为类成员函数
· a.xxx即结构体调用
§ 14.错误处理
· error
o package mainimport ("errors""fmt")type user struct {name stringpassword string}func findUser(users []user, name string) (v *user, err error) {for _, u := range users {if u.name == name {return &u, nil}}return nil, errors.New("not found")}func main() {u, err := findUser([]user{{"wang", "1024"}}, "wang")if err != nil {fmt.Println(err)return}fmt.Println(u.name) // wangif u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil {fmt.Println(err) // not foundreturn} else {fmt.Println(u.name)}}
§ wangnot found
§ 15.字符串操作
· Contains:一个字符串中是否包含另一个字符串
· Count:字符串计数
· Index:查找某个字符串的位置
· Join:连接多个字符串
· Repeat:重复多个字符串
· len:获取字符串长度
§ 16.字符串格式化
· 变量统一为%v
o 不同于c语言:字符串%s,数字%v
§ package mainimport "fmt"type point struct {x, y int}func main() {s := "hello"n := 123p := point{1, 2}fmt.Println(s, n) // hello 123fmt.Println(p) // {1 2}fmt.Printf("s=%v\n", s) // s=hellofmt.Printf("n=%v\n", n) // n=123fmt.Printf("p=%v\n", p) // p={1 2}fmt.Printf("p=%+v\n", p) // p={x:1 y:2}fmt.Printf("p=%#v\n", p) // p=main.point{x:1, y:2}f := 3.141592653fmt.Println(f) // 3.141592653fmt.Printf("%.2f\n", f) // 3.14}
§ 17.JSON处理
· 默认首字母大写
o package mainimport ("encoding/json""fmt")type userInfo struct {Name stringAge int json:"age"Hobby []string}func main() {a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}buf, err := json.Marshal(a)if err != nil {panic(err)}fmt.Println(buf) // [123 34 78 97...]fmt.Println(string(buf)) // {"Name":"wang","age":18,"Hobby":["Golang","TypeScript"]}buf, err = json.MarshalIndent(a, "", "\t")if err != nil {panic(err)}fmt.Println(string(buf))var b userInfoerr = json.Unmarshal(buf, &b)if err != nil {panic(err)}fmt.Printf("%#v\n", b) // main.userInfo{Name:"wang", Age:18, Hobby:[]string{"Golang", "TypeScript"}}}
§ 18.时间处理
· time.Now获取当前时间
· time.Date构造时间
· .sub计算时间段差值
· time.Format/time.Parse+示例字符串规范时间格式
· time.Unix获取时间戳
§ 19.数字解析
· strconv转换数字与字符串
· ParseInt和ParseFloat解析数字(字符串,进制,位数)
· Atoi快速将十进制字符串改成数字/数字转回字符串
§ 20.进程信息
· os.Args获取命令进程的相关参数
o package mainimport ("fmt""os""os/exec")func main() {// go run example/20-env/main.go a b c dfmt.Println(os.Args) // [/var/folders/8p/n34xxfnx38dg8bv_x8l62t_m0000gn/T/go-build3406981276/b001/exe/main a b c d]fmt.Println(os.Getenv("PATH")) // /usr/local/go/bin...fmt.Println(os.Setenv("AA", "BB"))buf, err := exec.Command("grep", "127.0.0.1", "/etc/hosts").CombinedOutput()if err != nil {panic(err)}fmt.Println(string(buf)) // 127.0.0.1 localhost}
o 标准库
· 实战****
o 猜谜游戏
o 命令行词典
o SOCKS5代理