go语言入门 | 青训营笔记

80 阅读6分钟

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

一、认识GO语言:

  • GO语言简述

    Go语言是Googel开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编译语言

  • GO语言特点

  1. 高性能、高并发
  2. 语法简单、学习曲线平缓
  3. 丰富的标准库
  4. 完善的工具链
  5. 静态链接
  6. 快速编译
  7. 跨平台
  8. 垃圾回收
  • Go语言的优势

具有像Python一样的简洁代码、开发速度,又具有C语言一样的执行效率,优势突出。

二、基础语法:

  • HelloWorld

    犹如定律一般,学习一门语言的第一件事就是输出HelloWorld,那么我们就从这个HelloWorld中读出点门道

以上是GO语言输出Hello World的代码,那么可以看出什么呢?我们从上到下来看一遍:

第一行package main:声明了一个名为main的package,跟Java的package概念相似,表示为一个相同功能代码的集合。一个package会包含一个或者多个.go源代码文件,每一个源文件都是以package开头。

第二行import "fmt"import语句也跟Java类型,引入其它package到当前文件中,这样可以在当前文件中使用其它package的变量、常量、类型、方法等。GO标准库提供了一百多个package,而fmt这个package包含了输入输出的各种函数,例如下面fmt.Println就是其中的一个输出函数

第三行func main():声明了一个main函数,可以看出在GO语言中使用func声明一个函数,后面紧接着函数名

第四行 fmt.Println("Hello World!"):函数内的执行逻辑,fmt.Println()函数输出文本内容,fmt是import进来的包,通过fmt.方法来调用fmt包内的方法

通过简单的HelloWorld可以学习到:
                                1、通过package声明一个包
                                2、使用import导入其它包
                                3、使用func声明一个函数
                                4、main函数是Go语言的入口
                                5、语句的结尾不需要分号结束
                                6、GO语言不需要显示声明方法或者变量的作用范围
                                (GO语言通过变量或者方法名的首字母是大写还是小写来确定作用范围,大写字母开头的为public,小写字母开头的为private)
                                7、通过包名.方法名调用方法
  • 变量

GO语言的基本类型有:

布尔值:bool
字符串:string
整型:int8int16int32int64  (int32位操作系统上是int32,在64位操作系统上的int64)
无符号整型:uint8、unit16、unit32、unit64  (uint32位操作系统上是int32,在64位操作系统上的int64)
浮点型:float32float64

GO语言中声明一个变量:

1、声明变量的一般形式是使用 var 关键字:var [name] [type] 
2、常量使用关键字 const 定义,用于存储不会改变的数据
3、例如上述代码 var a = "initinal" ,此时var [name] [type] 中的type可以省略
4var也可以省略,使用 := ,例如 tmp := 10
5、只有整型、浮点型、字符串和切片能够强制转换
6、类似Java可以使用 + 进行字符串拼接
  • if else

    if else 与Java用法类似,在GO语言中省去了双括号(),而且在if 后面可以声明变量

  • 循环

    在GO语言中只有一种循环,就是for循环 其形式有:

    for{
        表达式
    }
    for i := 0; j < 10; j++ {
        表达式
    }
    for i < 10 {
        表达式
    }
    
  • switch

    switch的用法也和Java类似,跟if else一样不需要双括号,跟java不同的是case中不需要手动break,每一个case执行完默认break,也可以使用switch代替多个if else

  • 数组

    声明数组

    var a [5]int
    a[4] = 100
    b := [5]int{1,2,3,4,5}
    var twoD [2][3]int
    
  • 切片

       s := make([]string,3)
       s[0] = "a"
       s[1] = "b"
       s[2] = "c"
       
    

    Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片(“动态数组'),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

  • map

    Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

    Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。

    可以使用内建函数 make 也可以使用 map 关键字来定义 Map:

    
    /* 声明变量,默认 map 是 nil */
    var m map[key type]value type
    
    /* 使用 make 函数 */
    m := make(map[key type]value type)
    
  • range

    Go 语言中 range 关键字用于for循环中迭代数组 (array)、切片 (slice)、链表 (channel)或集合 (map)的元素。 在数组和切片中它返回元素的索引值,在集合中返回 key-value 对的 key 值。

    num := []int{1,2,3}
    sum := 0
    for i,num := range nums{
        sum += num
        if num == 2 {
            fmt.Println("index:",i,"num",num)
        }
    }
    
    m := map[string]string{"a":"A","b":"B"}
    //遍历map
    for k,v := range m{
        fmt.Plrintln(k,v)
    }
    //遍历map中的key
    for k := range m{
        fmt.Println("key",k)
    }
    
  • 函数

Go 语言函数定义格式如下:

func 函数模( 参数列表 ) [返回值类型(为void时可以省略)] {
   逻辑代码
}
  • 指针

GO语言中也有指针,如上述代码所示,需要通过函数改变变量值时需要传递变量地址

  • 结构体

GO中不存在类Class的概念,而是结构体Struct的概念

    声明结构体:
    type user struct{
        name string
        password string
    }

声明结构体变量

    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
    
  • 结构体方法

    声明结构体方法:

    //检查密码是否相等
    func (u user) checkPassword(password string) bool{
        return u.password == password
    }
    //修改密码
    func (u *user) resetPassword(password string){
        u.password == password
    }
    
  • 错误处理

    GO语言中没有像Java那样的错误处理(throw,try-catch等)操作,GO中通过判断返回值来表示是否错先错误

      //需要引入"error"包
      import "error"
      
      //声明函数
        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") 
        }
        
      //创建变量接收函数值
      u, err := findUser([]user{{"wang","1024"}},"wang")
      if err != nil {
          fmt.Println(err)
          return
      }
    
  • 字符串操作

三、GO语言入门实战:

三个实战:

  1. 猜谜游戏

    猜谜游戏项目中使用到了变量创建、fo循环的使用、错误处理、输入输出、if else等基础知识

  2. 在线词典

    在线词典项目中使用到了结构体、json处理、函数声明等基础知识

  3. SOCKS5 代理

    (时间关系暂未实现和总结)

四、个人总结:

因为有一定的Java基础,所以学习起GO语言也比较容易入门,但是这一门语言与Java也有许多的不一样,敲代码的时候经常习惯性使用了Java的语法,总体来说还是比较容易上手的一门语言,使用感觉也比较轻便。当然这是初体验与初感受,更多还是得继续学习巩固。

五、引用参考: