Go语言基础 | 青训营笔记

388 阅读3分钟

Go语言基础

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

简介

Go语言特点

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

Why

  • python性能的问题
  • C++在web上不方便的问题

入门

开发环境

  • 安装Golang

    • 配置GOROOT
    • 配置GOPATH
  • 安装Goland(收费、可以有学生版本)

    • 配置上述
    • 配置代理

基础语法

  • Hello World

    fmt是Go语言的一个标准包

     package main
     ​
     import "fmt"
     ​
     func main() {
         fmp.Println("hello world!")
     }
    
  • 变量,静态语言,每一个变量都要有它的类型,但是可以通过冒号等号来推断类型

    • var声明 var name type = value
    • 冒号等于 x := 123
  • 分支语句

    • if - else都要写大括号,每一个后面都要
    • case可以不加break,满足一个条件就过去了
  • 循环语句

    • 只有 for 没有 while,但是 for 支持了想要的 while 的语法
    • 有增强 for for k, v := range(mp) 直接遍历 k 和 v
  • 数组

    • var name [size]type
  • 切片

    • s = make([]string, 3)
    • append 是有返回值的,需要迭代赋值
  • map

    • m = make(map[key type]value type)
    • 赋值加入
    • delete删除
    • 完全无序的
  • 结构体

    • type name struct{prop1 type prop2 type}
    • 结构体方法可以理解为成员函数,只有结构体的对象可以调用 func (u user) checkPwd(password string) bool
  • 错误异常处理

    • error类型
    • 会有异常的方法,都必须返回出来,要么用匿名变量舍弃,要么处理
    • 方便操作
  • 格式化

    • 可以用%v来代表任意类型的变量,而不需要像C语言中的%d、%s之类的
    • %+v可以显示详细的结构
    • %#v比上述更为详细
  • JSON

    • 对于结构体中的变量,我们只需要把变量首字母变成大写,那么它就可以通过 json.Marshal() 序列化
    • 序列化后的可以通过 json.Unmarshal() 反序列化
  • 时间

    • 可以通过time包处理时间

       package main
       ​
       import(
           "fmt"
           "time"
       )
       ​
       func main() {
           now := time.Now() // 获取现在的时间
           t1 := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)
           t2 := time.Date(2022, 3, 27, 2, 230, 36, 0, time.UTC)
           diff := t2.Sub(t1) // 获取两个时间的差值
           x := time.Unix() // 获取当前时间戳
       }
      
  • 数字解析

    • strconv.Atoi 表示任意实体转换为数字
    • strconv.Itoa 表示任意数字转换为实体

实战

猜谜游戏

程序会生成一个 0 - 100 之间的整数,提示玩家进行猜测,每一次猜测给出反馈结果,如果猜测的数比真实数字小,则给予 Your guess is smaller than the secret number. Please try again ,如果猜测的数比真实数字大,则给予 Your guess is bigger than the secret number. Please try again ,如果猜测正确,给予 Correct, you Legend! ,程序结束

  1. 生成一个随机数

    1. 为了防止生成伪随机数,需要一个随机种子,我们用当前时间的时间戳来生成
    2. rand.Intn(n) 会生成一个 [0,n)[0, n) 之间的随机数,我们需要最大的是100,因此设置为101即可
  2. 进行猜测和判断

>p> 1. 分支语句的实现

  1. 结果反馈
 package day1
 ​
 import (
    "fmt"
    "math/rand"
    "time"
 )
 ​
 func Guess() {
    rand.Seed(time.Now().Unix())
    x := rand.Intn(101)
    var now int
    fmt.Println("Please input your guess")
    for now != x {
       _, _ = fmt.Scan(&now)
       fmt.Printf("Your guess is %d\n", now)
       if now > x {
          fmt.Println("Your guess is bigger than the secret number. Please try again")
       } else if now < x {
          fmt.Println("Your guess is smaller than the secret number. Please try again")
       }
    }
    fmt.Println("Correct, you Legend!")
 }