Go 语言入门指南:基础语法和常用特性解析| 豆包MarsCode AI刷题

103 阅读6分钟

Go语言基础****


· 简介****

o RPC框架

§ remote procedure call远过程调用

· 

· 入门****

o 开发环境

§ 安装golang

· go.dev/

· studygolang.com/dl

· goproxy.cn

§ 配置集成开发环境

· 编译器、IDE

o VScode、Goland(收费、教育优惠)

§ VS记得安装go语言插件

· IDE:integrated development environment集成开发环境,用于提供程序开发环境的应用程序

o 代码编辑器

o 编译器

o 调制器

o 图形用户界面

· 集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套

· 练习可以用gitpod

gitpod.io/#github.com…

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代理