Go语言基础语法学习笔记

127 阅读4分钟

Go语言基础语法学习笔记

1. 导包

import "fmt"
import  (
    "fmt"
    "math"
)

2. 变量

  • 声明变量

    • var 变量名(会自动识别输入值的类型)

      •   var a = "inital"
          var b, c int = 1, 2
          var e float64
        
      •   f := 123
        
    • const 常量名(通过上下文自动确定类型)

      •   const a = "asdasdsa"
          const b string = "asdasd"
        

3. 函数的声明

func 函数名([参数列表]) [返回值类型列表] {
    函数体
}

4. 基础语法

  • if else(类似于Python?代码块表示由:缩进变为{})

    •   if 判断条件 {
            判断结果(true),代码块
        } else {
            判断结果(false),代码块
        }
      
    •   if [赋值语句;]判断条件 {
            // 通过该赋值语句创建的变量,作用域在该if语句之中属于局部变量
            判断结果(true),代码块
        } else if 判断条件 {
            判断结果(true),代码块
        } else {
            判断结果(false),代码块
        }
      
  • for

    • 死循环

      •   for {
              循环体
          }
        
    • 普通的for循环

      •   for i:=0; i < 10; i++ {
              循环体
          }
        
    • 仿while(伪)

      •   i := 0
          for i < 10 {
              循环体
              i++
          }
        
    • 仿do...while(伪)

      •   i := 0
          for {
              循环体
              if i > 10 {
                  break
              }
          }
        
  • switch

    •   switch 变量 {
            // 变量类型任意
            case 变量结果1:
                语句块
            case 变量结果2:
                语句块
            default:
                语句块
        }
      
    • 取代if写法

      •   i := 10
          switch {
              case i > 10:
                  语句块
              default:
                  语句块
          }
        
  • 数组

    • 声明方式

      •   var a [5]int
          b := [5]int{1, 2, 3, 4, 5}
        
  • 切片(可变长度的数组)

    • 语法

      •   s := make([]string, 3)
          // 初始值为:“\u0000”?看到都是空
        
      •   a := make([]int, 5)
           // 初始值为:0
          a := make([]float32, 5)
          // 初始值也为:0?和java有些不一样,使用fmt.Printf("%v ", a[i])进行打印验证
          a := make([]float64, 5)
          // 初始值为:0
        
    • 扩容

      • image-20230725095858065.png

      • 通过上图可以得出

        1. append是是追加,向数组的末尾进行添加数据,同时进行对应长度扩容
      • image-20230725100439248.png

      • 发现一个有点意思的用法

    • 切片操作

      •   //类似Python
          s := []string{"a", "b", "c", "d", "e", "f"}
          fmt.Print(s[2:5])
          // 前闭后开{)
        
  • map

    • 语法

      •   m := make(map[string]int)
          // 类似Python中的字典 m = {key[string]:value[int]}
          // 访问和赋值方式也差不多
          // 使用make?应该也是动态的吧,但是和数组有些不同,后面没有表示长度的数字?默认值是零吗?
          m["one"] = 1
          m["two"] = 2
        
      • image-20230725101740389.png
      • 猜想错误,应该是map的特性
      •   m := map[string]int{"one": 1, "two": 2}
        
      • image-20230725102213375.png
      • map确实是自带扩容
      • image-20230725102322504.png
      • 这种写法也是可以的
  • range

    • 语法

      •   // 结合for进行使用
          // 实现类似java中的增强for,Python中 for in的效果
          nums := []int{2, 3, 4}
          for i, num := range nums{
              // 第一个参数为下标,第二个参数为对应下标的数据
              循环体
          }
        
      •   m := map[string]int{"one": 1"two": 2}
          for k, v := range m {
              // 第一个参数为:key,第二个参数为:value
              循环体
          }
        
  • 指针

    • 指针的主要作用是用来操作数据,如果你想对数据进行增删改需要使用指针,如何只是为了使用则不需要使用指针。
    • 指针是直接使用对应的数据,普通传参会进行一个拷贝会消耗内存和时间。
  • 结构体

    • 语法

      •   type 结构体名 struct {
              变量名 变量类型
          }
        
  • 结构体方法

    • 语法

      •   func (形参 绑定结构体名) 结构体方法名([参数列表]) [返回值类型列表] {
              方法体
          }
        
    • 面向对象的感觉,结构体是对象的类属性,结构体是类方法

  • 错误处理

    •   import (
            "errors"
            "fmt"
        )
        errors.New(message) //创建一个报错信息
      
  • 字符串操作

    •   import (
            "strings"
        )
      
    •   strings.Contains(a, "ll")   //在字符串中查找是否存在"ll"字符串, 返回值bool
        strings.Count(a, "l")   //统计字符串"l"在a中出现的次数,返回值int
        strings.Index(a, "ll")  //查找某个字符串出现的位置,返回值int
        strings.Split("a,v,b,f,h", ",")     //分割字符串,返回值[]string
        strings.ToLower(a)  //字符串全小写,返回值string
        strings.ToUpper(a)  //字符串全大写,返回值string
        len(a)  //得到长度,返回值int
      
  • JSON处理

    •   import (
            "fmt"
            "encoding/json"
        )
        type userInfo struct {
            Name string
            Age string `json:"age"`
            Hobby map[string]int
        }
        func main() {
            a := userInfo{Name: "小陈", Age: 18, Hobby: map[string]int{"Golang": 90, "Java": 95}}
            buf, _ := json.Marshal(a)
            fmt.Println(a)
            fmt.Println(buf)
            fmt.Println(string(buf))
        }
      
    • image-20230725113714730.png
    • 真方便
  • 时间处理

    •   import (
            "fmt"
            "time"
        )
        func main() {
            now := time.Now() //获取当前时间信息
            fmt.Println(now.Format("2001-02-15 15:15:05"))
            fmt.Println(now)
        }
      
    • image-20230725114836452.png
    • 可见格式化时间信息并不会对原数据产生影响,并且可以得出Format()返回值为string类型
    •   func main() {
            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(t2)
            diff := t2.Sub(t) // t2 - t
            fmt.Println(diff)
            diff2 := t.Sub(t2) // t - t2
            fmt.Println(diff2)
        }
      
    • image-20230725115731542.png
    • 可以放心减,超时了就是负数
  • 数字解析

    •   import (
            "strconv"
        )
        n, err := strconv.Atoi("123")   //字符串数字转换成数字,返回值数字类型,errors