go语言进阶 : 进阶语法 | 青训营笔记

160 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记

go语言进阶

数组

func main()  {
   // 定义一个长度为5的int数组
   var a [5]int
   a[4] = 100
   // 和平常的数值使用方法差不多,默认值为0
   fmt.Println(a[0], a[4], len(a))

   var b [5][4]int
   b[1][1] = 100
   fmt.Println(b[1][1])
}

切片

func main() {
   // 理解为生成一个可变长度的数组
   s := make([]string, 3)
   s[0] = "0"
   s[1] = "1"
   s[2] = "2"
   fmt.Println(s[0], s[1], s[2], len(s))
   // 通过append 添加元素
   s = append(s, "3")
   fmt.Println(s[3])

   c := make([]string, len(s))
   copy(c, s) // 将s 复制给 c
   fmt.Println(c)

   fmt.Println(c[0:1]) //左闭右开 ,将0号元素切成整体
   fmt.Println(c[:3]) // 将输出从0 到 2
   fmt.Println(c[2:]) //将输出从2 到最后


   good := []string{"g","o","o"}
   good = append(good, "d")
   fmt.Println(good)
}

map

func main() {

   m := make(map[string]int)
   m["one"] = 1
   m["two"] = 2
   fmt.Println(m)
   fmt.Println(m["one"])
   fmt.Println(m["unknow"])

   //r, ok := m["one"] 第一个是0,第二个是false因为不存在
   //fmt.Println(r, ok) 1 true

   r, ok := m["one"]
   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

func main()  {
   nums := []int{1,2,3}
   sum := 0
   // 使用range遍历 第一个索引,第二个值
   for i,num := range nums {
      sum += num
      if num == 2 {
         fmt.Println("index", i, "num", num)
      }
   }
   fmt.Println(sum)

   // 遍历map,map遍历纯随机
   m := map[string]int{"one":1,"two":2}
   for k, v := range m{
      fmt.Println("key", k, "value", v)
   }
}

函数

// 可以指定传入参数及类型 返回值为 int
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
}
// 并且返回值可以直接拿来用
func print()(str string){
   str = "hello"
   return str
}

func main()  {
	print()
	res := add(1,2)
	fmt.Println(res)

	v, ok := exists(map[string]string{"one": "1"},"one")
	fmt.Println(v, ok)
}

指针

func add(a int){
   a += 1
}
// 使用指针
func add2(a *int)  {
   *a += 1
}
func main()  {
   n := 0
   add(n)
   fmt.Println(n)
   // 调用时 加上&
   add2(&n)
   fmt.Println(n)
}

结构体

type user struct {
   name string
   password string
}

func main() {

   a := user{name: "xiao", password: "1024"}
   fmt.Println(a)

   b := user{name: "luo"}
   fmt.Println(b)

   b.password = "777"
   fmt.Println(b)

   c := user{ "qi", "1024"}
   fmt.Println(c)
   
   var d user
   d.name = "wang"
   d.password = "ok"
   fmt.Println(d)
}

结构体方法

type user struct {
   name string
   password string
}
// 谁能调用该方法 -> user结构体
func (u user)checkPassword(password string) bool  {
   return u.password == password
}
func main() {
   u := user{"wang", "1024"}
   fmt.Println(u.checkPassword("1024"))
   fmt.Println(u.checkPassword("1000"))
}

错误处理

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)

   if u, err := findUser([]user{{"wang", "1024"}}, "wan");err != nil {
      fmt.Println(err)
   } else {
      fmt.Println(u)
   }

}

字符串操作

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
}

字符串格式化

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

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"}}
}

时间处理

func main() {
	now := time.Now()
	fmt.Println(now) // 2022-03-27 18:04:59.433297 +0800 CST m=+0.000087933
	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)                                                  // 2022-03-27 01:25:36 +0000 UTC
	fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute()) // 2022 March 27 1 25
	fmt.Println(t.Format("2006-01-02 15:04:05"))                    // 2022-03-27 01:25:36
	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
}

数字解析

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
}

进程查看

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
}