Go入门学习|青训营笔记

77 阅读4分钟

Go入门学习|青训营笔记

这是我参与的「第五届青训营 」笔记创作活动的第1天

一、本堂课重点内容:

  • 为什么要使用Go
  • Go的基本语法

二、详细知识点介绍:

  • Go的特性

    • 高性能、高并发
    • 语法简单、学习曲线平缓
    • 丰富的标准库
    • 完善的工具链
    • 静态链接
    • 快速编译
    • 跨平台
    • 垃圾回收
  • Go的语法特点

    • Go的基本布局与用法

      • Go语言通过包来进行组织。
        main包比较特殊,其定义了一个独立可执行的程序,不是一个库,它是整个程序的入口。
        Import 声明必须跟在package声明后面。
        package:“包”,指:类所在的包
        import:“引入”,指:引入类中需要的类。
      • 必须告诉编译器源文件需要哪些包,这就是跟随在package声明后面的import声明扮演的角色。hello world例子只用到了一个包,大多数程序需要导入多个包。
      • 必须恰当导入需要的包,缺少了必要的包或者导入了不需要的包,程序都无法编译通过。这项严格要求避免了程序开发过程中引入未使用的包
    • Go的基本语法

      • if-else 判断结构:没有括号,同时大括号必须与if一行(这一点和C语言不同,需要注意)

      • 循环只有for,没有while

      • switch case :不用加break,对于变量可以使用任意数据类型,很方便

      • 数组:声明方式:var a [5]int,表示声明了长度为5的整型数组

      • 切片:可变长度的数组,声明方式:a = make ([]int,5),表示声明了长度为5的整型切片

      • map:哈希字典,声明方式:mp = make (map[string]int),其内部是乱序的,随机输出,操作有增删查改,appenddelete,以及支持k-v索引式的修改

      • range:常用于for循环语句,得到第一个是索引,第二个是值

      • 函数:关键字为func, 参数的类型放后面,参数本身在前面,这一点和Mysql很像,返回值有bool类型的ok,表示是否存在或是是否有错误

      • 指针:用于传进函数内部,进行修改结构体的值或者调用者内部的值

      • 结构体:声明

         type user struct {
             name     string
             password string
         }
        

        如果是JSON类型需要将name、password变量首字母大写

        支持索引修改结构体内部的变量

             var d user
             d.name = "wang"
             d.password = "1024"
        
      • 结构体方法:需要在func后面加上结构体参数,这一点与c++不同

         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
         }
        
      • 错误处理:在参数中加一个error类型,如果出错就返回一个error.new("错误信息"),未出错就返回nil

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

三、实践练习例子:

  • 神奇的字符串操作

     package main
     ​
     import (
         "fmt"
         "strings"
     )
     ​
     func main() {
         a := "hello"
         fmt.Println(strings.Replace(a, "e", "E", -1))         // hEllo
         // 1. a[1] = 'E' 错误操作
         b := "你好"
         fmt.Println(len(b)) // 6
         // 2. 长度为6为什么不是2,如何才能获得中文的长度呢,如果是“hello,世界”,该怎么获得其长度?
         fmt.Println(len([]rune(b))) // 2
     }
    

    伴随着上面的几个问题,我对字符串进行了深入了解

     // string is the set of all strings of 8-bit bytes, conventionally but not
     // necessarily representing UTF-8-encoded text. A string may be empty, but
     // not nil. Values of string type are immutable.
     type string string
     -----------------------------------
    

    可以翻译为:string是8位字节的集合,通常但不一定代表UTF-8编码的文本。string可以为空,但不能为nil。string的值是不能改变的

    但是可以通过内置的方法修改,如Replace

    下一个问题中文字符的问题应该怎么解决?

     1.byte类型
         byte类型是uint8的别名,表示一个字节,
     2.rune类型
         rune类型是Go语言中的一个基本类型,其实就是一个int32的别名,主要用于表示一个字符类型大于一个字节小于等于4个字节的情况下,特别是中文字符。
    

    对于英文字符串,不管是用rune类型还是byte类型,不管是字符串的长度还是取值,都是相同的。2).对于中文字符来说,rune类型的操作就比byte类型的操作更加友好很多,我们可以通过[:]操作直接取出中文的对应数量。

  • 经典的Hello world
  package main
  ​
  import (
      "fmt"
  )
  ​
  func main() {
  ​
      fmt.Println("hello world")
  }
  ​

麻雀虽小五脏俱全,这是每个入门程序员第一个接触到的程序,首先指明该包的位置是在main里,定义了程序的入口,其次该包调用了fmt包,用于格式化输出,接着是用括号进行限制,最后是一个main函数,调用fmt包里的Println函数进行字符串打印。

运行方式:在终端窗口输入:go run ./main.go或者是先编译为exe文件在进行运行:go build ./main.go,接着对于生成的exe文件,执行:./main.exe

四、课后个人总结:

  • JSON的处理还不是很清楚,后面需要继续学习

五、引用参考:

(68条消息) Go语言中rune方法如何使用_go rune_胡桃木子的博客-CSDN博客