GO语言基础/实战案例 | 青训营笔记

48 阅读4分钟

go语言的基础语法

变量定义可以直接使用 x:=1去实现,类似于C++中的auto x = 1

没有while循环,直接for循环解决,注意就是不加括号,但是循环体要加上大括号

if和else也同理,switch和C++有所不同,C++的switch在执行完case之后如果没有break会将后续所有case都执行一遍,而golang只会执行当前case,执行完之后就会自动跳出switch。

数组有静态数组,也有类似于stl库的vector的切片slice

goroutine就类似于线程,只不过效率更高

在Go语言中,每一个并发的执行单元叫作一个goroutine。设想这里的一个程序有两个函数,一个函数做计算,另一个输出结果,假设两个函数没有相互之间的调用关系。一个线性的程序会先调用其中的一个函数,然后再调用另一个。如果程序中包含多个goroutine,对两个函数的调用则可能发生在同一时刻。马上就会看到这样的一个程序。在Go语言中,每一个并发的执行单元叫作一个goroutine。设想这里的一个程序有两个函数,一个函数做计算,另一个输出结果,假设两个函数没有相互之间的调用关系。一个线性的程序会先调用其中的一个函数,然后再调用另一个。如果程序中包含多个goroutine,对两个函数的调用则可能发生在同一时刻。马上就会看到这样的一个程序。

而channel就类似于管道,实现多线程之间的内存共享通信

range 关键字在 go 语言中是相当常用好用的语法糖,可以用在 for 循环中迭代 arrayslicemapchannel字符串所有涉及到遍历输出的东西。

哈希表是一种巧妙并且实用的数据结构。它是一个无序的key/value对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value。

在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应key和value。map中所有的key都有相同的类型,所有的value也有着相同的类型,但是key和value之间可以是不同的数据类型。其中K对应的key必须是支持==比较运算符的数据类型,所以map可以通过测试key是否相等来判断是否已经存在。虽然浮点数类型也是支持相等运算符比较的,但是将浮点数用做key类型则是一个坏的想法,正如第三章提到的,最坏的情况是可能出现的NaN和任何浮点数都不相等。对于V对应的value数据类型则没有任何的限制。

Go语言提供的映射关系容器为 map , map 使用散列表hash实现。查找复杂度为O(1),和数组一样,最坏的情况下为O(n),n为元素总数。

数据类型的出现是为了把数据分成所需内存大小不同的数据。

  • 布尔型(bool): 值只可以是常量 true 或者 false
  • 数字类型: 整型 int 和浮点型 float,支持复数(业务代码用不到),其中位的运算采用补码。
  • 字符串类型(string): 使用UTF-8编码标识Unicode文本。
  • 其他:指针、数组、结构体(struct)、联合体 (union不常用)、函数、切片、接口(interface)、Map 、 Channel

&#v 打印结构体,最详细的方式

json转换go strcut网址:oktools.net/json2go

socks5原理

image.png

以下是猜数字游戏

package main

import (
	"bufio"
	"fmt"
	"math/rand"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	maxNum := 100
	rand.Seed(time.Now().UnixNano())
	secretNumber := rand.Intn(maxNum)
	// fmt.Println("The secret number is ", secretNumber)

	fmt.Println("Please input your guess")
	reader := bufio.NewReader(os.Stdin)
	for {
		input, err := reader.ReadString('\n')
		if err != nil {
			fmt.Println("An error occured while reading input. Please try again", err)
			continue
		}
		input = strings.Trim(input, "\r\n")

		guess, err := strconv.Atoi(input)
		if err != nil {
			fmt.Println("Invalid input. Please enter an integer value")
			continue
		}
		fmt.Println("You guess is", guess)
		if guess > secretNumber {
			fmt.Println("Your guess is bigger than the secret number. Please try again")
		} else if guess < secretNumber {
			fmt.Println("Your guess is smaller than the secret number. Please try again")
		} else {
			fmt.Println("Correct, you Legend!")
			break
		}
	}
}