Go语言基础到小demo实战 | 青训营笔记

341 阅读4分钟

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

一、搭建开发环境

我使用的Windows平台,我就以Windows平台为例。

1.在官网下载go的安装包
Go官网下载地址:https://golang.org/dl/
Go官方镜像站(推荐):https://golang.google.cn/dl/

2.配置系统环境变量GOROOT

QQ截图20220507212257.png

3.配置系统环境变量GOPROXY
Go1.14版本后,都推荐使用go mod模式来管理依赖环境了,也不强制我们必须把代码写在GOPATH下的src目录下了,
所以你可以在电脑的任意位置编写go代码了。默认的GOPROXY的配置是GOPROXY=https://proxy.golang.org,direct 
由于国内访问不到https://proxy.golang.org ,所以我们需要换一个PROXY,
这里推荐使用https://goproxy.io 或 https://goproxy.cn。
可以执行下面的命令修改GOPROXY:go env -w GOPROXY=https://goproxy.cn,direct

二、基础语法

go语言的变量和方法定义与Java不同,go是变量名在前,数据类型在后,而Java相反

go的数据类型:

   1. 基本数据类型
        整型 int
        浮点型 float32,float64
        复数 complex64,complex128
        字符串 string
        布尔值 bool


   2. 聚合类型
        数组 
        结构体 


   3. 引用类型
        指针 
        切片 
        集合 
        函数 
        channel

   4. 接口类型



go的变量定义格式:
    var [变量名] [数据类型]
    
   例如: 
         var num int
         var str string
         var nums [3]int
         var slice []string
         var map map[int]string
         
         
 
go的错误处理:
    go语言中有一个error类,用来返回错误信息,我们只需要获得返回的错误对象,就可以知道一些错误信息
    
    

    
字符串的一些操作:

package main

import (
	"fmt"
	"strings"
)

func main() {
	a := "hello"
	fmt.Println(strings.Contains(a, "ll"))                // 判断a中是否包含ll
	fmt.Println(strings.Count(a, "l"))                    // 计算a中的l的数量
	fmt.Println(strings.HasPrefix(a, "he"))               // 判断a是否是he前缀
	fmt.Println(strings.HasSuffix(a, "llo"))              // 判断a是否是llo后缀
	fmt.Println(strings.Index(a, "ll"))                   // 返回ll在a中的位置
	fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // 将he和llo用-连接
	fmt.Println(strings.Repeat(a, 2))                     // 将a翻倍
	fmt.Println(strings.Replace(a, "e", "E", -1))         // 将a中的e转换成E
	fmt.Println(strings.Split("a-b-c", "-"))              // 将a-b-c以-分割成一个字符数组
	fmt.Println(strings.ToLower(a))                       // 全部转小写
	fmt.Println(strings.ToUpper(a))                       // 全部转大写
	fmt.Println(len(a))                                   // a的长度
	b := "你好"
	fmt.Println(len(b)) // 一个中文汉字对应3个长度
}
 字符串格式化:
 
 格式控制符:%d 整型,%s字符串,%f浮点型,%v任意类型 
             %v只能打印变量值
             %+v打印变量名和值
             %#v打印具体类下的变量名和值
 
 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格式处理:

想要结构体能够序列化则需要首字母大写,并在结构体的字段后面加上`json:"[name]"`
type userInfo struct {
 Name  strin `json:"name"`
 Age   int `json:"age"`
 Hobby []string
}

序列化:
 a := userInfo{Name: "xu", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
 buf, err := json.Marshal(a)
 
反序列化:
 buf为上面序列化成功的字节数组
 var b userInfo 
 err = json.Unmarshal(buf, &b)
 
     
     
 
时间处理:

package main

import (
 "fmt"
 "time"
)

func main() {
 now := time.Now()
 fmt.Println(now) // 获取当前时间
 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(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute()) // 获得当前的年月日时分
 fmt.Println(t.Format("2006-01-02 15:04:05"))                    //  将当前时间按照format格式输出
 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()) // 获取时间戳
}

三、猜字谜游戏

如何获取随机数?
1.首先要设置随机数种子 rand.Seed(time.Now().UnixNano())
2.然后才能获得随机数,使用rand类 secretNumber := rand.Intn(100)

如何从键盘输入整数?
_, err := fmt.Scanf("%d\n", &guess)

在这里有一个坑,使用scanf读取的时候,会读取到上一次遗留的换行符\n,所以导致进行一次输入后直接进行第二次读取
并返回错误。错误如下图所示,所以在%d后面加一个\n,这样可以保证下次读取的时候,开头没有换行符


QQ截图20220507224535.png

四、命令行字典

这里关键就是如何使用下面两个工具来生成Go代码了
[JSON转Golang Struct - 在线工具 - OKTools](https://oktools.net/json2go)
[Convert curl commands to code](https://curlconverter.com/)
第一个可以将json字符串自动生成对应的结构体代码
第二个可以根据接口url地址,自动生成请求该接口的Go代码

五、SOCKS5代理

....还没搞太明白....