Go语言基础 | 青训营笔记

90 阅读7分钟

Go语言基础

什么是Go语言

Go语言是一种开源的编程语言,由Google公司开发。它的设计目标是简单、高效、可靠,适用于构建大型软件系统。Go语言具有静态类型、垃圾回收、并发编程、内存安全等特点,被广泛应用于网络编程、系统编程、云计算等领域。Go语言的语法简洁易学,同时也支持面向对象、函数式等编程范式。

Go语言的特点:

  1. 高效:Go语言的编译速度快,执行速度也快,与C语言相当。
  2. 并发编程:Go语言天生支持并发编程,可以轻松地编写高并发的程序。
  3. 内存管理:Go语言具有垃圾回收机制,可以自动管理内存,减少程序员的负担。
  4. 丰富的标准库:Go语言拥有丰富的标准库,包括网络编程、加密、文件操作等等。
  5. 跨平台:Go语言可以在不同的操作系统上运行,如Windows、Linux、macOS等。
  6. 静态类型:Go语言是一种静态类型语言,可以在编译时检查类型错误,减少运行时错误。
  7. 易学易用:Go语言的语法简洁易学,可以快速上手。
  8. 开源:Go语言是一种开源的编程语言,可以自由使用、修改和分发。

目前使用Go语言开发的大厂:

image-20230512221552407.png

字节为什么选择Go语言:

  1. 最初使用的Python,由于性能问题换成Go
  2. C++ 不太适合在线 Web 业务
  3. 早期团队非 Java 背景
  4. 性能比较好
  5. 部署简单,学习成本低
  6. 内部 RPC 和 HTTP 框的推广

开发环境-安装Golang

下载 Golang的包

go.dev/

studygolang.com/dl

goproxy.cn/

Golang 里面有两个非常重要的环境变量 GOROOTGOPATH,其中:

  • GOROOT是安装 golang 的路径
  • GOPATH 是我们定义的自己的工作空间。

配置环境变量

  1. 在环境变量中添加 GOPATH,值为 Golang 的安装目录
  2. 在环境变量 PATH中添加 Golang 安装目录下的 bin 文件夹。
  3. 添加一个环境变量 GOPATH,值为你自己希望的工作目录
  4. 重启 命令行工具,输入 go env 命令即可查看配置信息

基础语法

fmt : Go 语言标准库中的 fmt 包提供了打印函数将数据以字符串形式输出到控制台、文件、其他满足 io.Writer 接口的至以及其他字符串中

HelloWorld

 package main
 ​
 import {
     'fmt'
 }
 ​
 func main(){
     fmt.Println("hello world")
 }

变量:

 package main
 ​
 import (
     "fmt"
     "math"
 )
 ​
 func main() {
 ​
     var a = "initial"
 ​
     var b, c int = 1, 2
 ​
     var d = true
 ​
     var e float64
 ​
     f := float32(e)
 ​
     g := a + "foo"
     fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
     fmt.Println(g)                // initialapple
 ​
     const s string = "constant"
     const h = 500000000
     const i = 3e20 / h
     fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
 }
 ​

if else

 package main
 ​
 import "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")
     }
 }
 ​
 package main
 import "fmt"
 func main() {
     if 7%2 == 0 (fmt.PrintIn("7 is even")
             } else (fmt.Println("7 is odd" )
     if 8%4 == 0 {
         fmt.PrintIn("8 is divisible by 4")
     if num := 9; num < 0 {
         fmt .Println(num,"is negative")
     } else if num < 10 {
     fmt.PrintIn(num,"has l digit")
     }else {
     fmt.Println(num,"has multiple digits")
 }

循环

 package main
 ​
 import "fmt"
 ​
 func main() {
 ​
     i := 1
     for {
         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
     }
 }
 ​

switch

 package main
 ​
 import (
     "fmt"
     "time"
 )
 ​
 func main() {
 ​
     a := 2
     switch 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")
     }
 }

数组Array

 package main
 ​
 import "fmt"
 ​
 func main() {
 ​
     var a [5]int
     a[4] = 100
     fmt.Println("get:", a[2])
     fmt.Println("len:", len(a))
 ​
     b := [5]int{1, 2, 3, 4, 5}
     fmt.Println(b)
 ​
     var twoD [2][3]int
     for i := 0; i < 2; i++ {
         for j := 0; j < 3; j++ {
             twoD[i][j] = i + j
         }
     }
     fmt.Println("2d: ", twoD)
 }
 ​

切片splic

 package main
 ​
 import "fmt"
 ​
 func main() {
 ​
     s := make([]string, 3)
     s[0] = "a"
     s[1] = "b"
     s[2] = "c"
     fmt.Println("get:", s[2])   // c
     fmt.Println("len:", len(s)) // 3
 ​
     s = 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]
 }
 ​

map

 package main
 ​
 import "fmt"
 ​
 func main() {
     m := make(map[string]int)
     m["one"] = 1
     m["two"] = 2
     fmt.Println(m)           // map[one:1 two:2]
     fmt.Println(len(m))      // 2
     fmt.Println(m["one"])    // 1
     fmt.Println(m["unknow"]) // 0
 ​
     r, ok := m["unknow"]
     fmt.Println(r, ok) // 0 false
 ​
     delete(m, "one")
 ​
     m2 := map[string]int{"one": 1, "two": 2}
     var m3 = map[string]int{"one": 1, "two": 2}
     fmt.Println(m2, m3)
 }
 ​

range

 package main
 ​
 import "fmt"
 ​
 func main() {
     nums := []int{2, 3, 4}
     sum := 0
     for i, num := range nums {
         sum += num
         if num == 2 {
             fmt.Println("index:", i, "num:", num) // index: 0 num: 2
         }
     }
     fmt.Println(sum) // 9
 ​
     m := map[string]string{"a": "A", "b": "B"}
     for k, v := range m {
         fmt.Println(k, v) // b 8; a A
     }
     for k := range m {
         fmt.Println("key", k) // key a; key b
     }
 }
 ​

函数func

 package main
 ​
 import "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) // 3
 ​
     v, ok := exists(map[string]string{"a": "A"}, "a")
     fmt.Println(v, ok) // A True
 }
 ​

指针point

 package main
 ​
 import "fmt"
 ​
 func add2(n int) {
     n += 2
 }
 ​
 func add2ptr(n *int) {
     *n += 2
 }
 ​
 func main() {
     n := 5
     add2(n)
     fmt.Println(n) // 5
     add2ptr(&n)
     fmt.Println(n) // 7
 }
 ​

结构体

 package main
 ​
 import "fmt"
 ​
 type user struct {
     name     string
     password string
 }
 ​
 func main() {
     a := user{name: "wang", password: "1024"}
     b := user{"wang", "1024"}
     c := user{name: "wang"}
     c.password = "1024"
     var d user
     d.name = "wang"
     d.password = "1024"
 ​
     fmt.Println(a, b, c, d)                 // {wang 1024} {wang 1024} {wang 1024} {wang 1024}
     fmt.Println(checkPassword(a, "haha"))   // false
     fmt.Println(checkPassword2(&a, "haha")) // false
 }
 ​
 func checkPassword(u user, password string) bool {
     return u.password == password
 }
 ​
 func checkPassword2(u *user, password string) bool {
     return u.password == password
 }
 ​

结构体方法

 package main
 ​
 import "fmt"
 ​
 type user struct {
     name     string
     password 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
 }
 ​

错误处理

 package main
 ​
 import (
     "errors"
     "fmt"
 )
 ​
 type user struct {
     name     string
     password 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) // wang
 ​
     if u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil {
         fmt.Println(err) // not found
         return
     } else {
         fmt.Println(u.name)
     }
 }
 ​

字符串操作

 package main
 ​
 import (
     "fmt"
     "strings"
 )
 ​
 func main() {
     a := "hello"
     fmt.Println(strings.Contains(a, "ll"))                // true
     fmt.Println(strings.Count(a, "l"))                    // 2
     fmt.Println(strings.HasPrefix(a, "he"))               // true
     fmt.Println(strings.HasSuffix(a, "llo"))              // true
     fmt.Println(strings.Index(a, "ll"))                   // 2
     fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
     fmt.Println(strings.Repeat(a, 2))                     // hellohello
     fmt.Println(strings.Replace(a, "e", "E", -1))         // hEllo
     fmt.Println(strings.Split("a-b-c", "-"))              // [a b c]
     fmt.Println(strings.ToLower(a))                       // hello
     fmt.Println(strings.ToUpper(a))                       // HELLO
     fmt.Println(len(a))                                   // 5
     b := "你好"
     fmt.Println(len(b)) // 6
 }
 ​

字符串格式化

 package main
 ​
 import "fmt"
 ​
 type point struct {
     x, y int
 }
 ​
 func main() {
     s := "hello"
     n := 123
     p := point{1, 2}
     fmt.Println(s, n) // hello 123
     fmt.Println(p)    // {1 2}
 ​
     fmt.Printf("s=%v\n", s)  // s=hello
     fmt.Printf("n=%v\n", n)  // n=123
     fmt.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.141592653
     fmt.Println(f)          // 3.141592653
     fmt.Printf("%.2f\n", f) // 3.14
 }
 ​

JSON处理

 package main
 ​
 import (
     "encoding/json"
     "fmt"
 )
 ​
 type userInfo struct {
     Name  string
     Age   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 userInfo
     err = json.Unmarshal(buf, &b)
     if err != nil {
         panic(err)
     }
     fmt.Printf("%#v\n", b) // main.userInfo{Name:"wang", Age:18, Hobby:[]string{"Golang", "TypeScript"}}
 }
 ​

时间处理

 package main
 ​
 import (
     "fmt"
     "time"
 )
 ​
 func main() {
     now := time.Now()
     fmt.Println(now)
     t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)
     t2 := time.Date(2022, 3, 27, 2, 30, 36, 0, time.UTC)
     fmt.Println(t)
     
     fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute()) 
     fmt.Println(t.Format("2006-01-02 15:04:05"))   
     diff := t2.Sub(t)
     fmt.Println(diff)                           // 1h5m0s
     fmt.Println(diff.Minutes(), diff.Seconds()) // 65 3900
     t3, err := time.Parse("2006-01-02 15:04:05", "2022-03-27 01:25:36")
     if err != nil {
         panic(err)
     }
     fmt.Println(t3 == t)    // true
     fmt.Println(now.Unix()) // 1648738080
 }
 ​

数字解析

 package main
 ​
 import (
     "fmt"
     "strconv"
 )
 ​
 func main() {
     f, _ := strconv.ParseFloat("1.234", 64)
     fmt.Println(f) // 1.234
 ​
     n, _ := strconv.ParseInt("111", 10, 64)
     fmt.Println(n) // 111
 ​
     n, _ = strconv.ParseInt("0x1000", 0, 64)
     fmt.Println(n) // 4096
 ​
     n2, _ := strconv.Atoi("123")
     fmt.Println(n2) // 123
 ​
     n2, err := strconv.Atoi("AAA")
     fmt.Println(n2, err) // 0 strconv.Atoi: parsing "AAA": invalid syntax
 }
 ​

进程信息

 package main
 ​
 import (
     "fmt"
     "os"
     "os/exec"
 )
 ​
 func main() {
     // go run example/20-env/main.go a b c d
     fmt.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
 }
 ​