青训营X豆包MarsCode Go语言入门1 | 豆包MarsCode AI 刷题

26 阅读4分钟

查看go的信息

go env
go env + "你想读取的信息"

记得设置go的代理

go env -w GOPROXY=https://goproxy.cn,direct

readByte读取

readByte的底层会每次读1kb或者更多的东西,所以他其实不是每次只读一个,所以读一个的时候会把后面的都读完,然后之后读的话就可以瞬间返回了

GO定义变量

GO 语言的特性是变量不是强类型的,会自己适应,而且对于变量的类型的定义是后置的

var a [5]int
a := [5]int
nums := []int

特殊变量_

_表示可以被忽略的值

defer的定义

defer之后的表示在函数结束的时候执行,这样就可以在某个生成的时候直接写下关闭的代码,以防后面忘记

resp, err := client.Do(req)
if err != nil {
	log.Fatal(err)
}
defer resp.Body.Close() //函数结束时才执行

make的使用

用make来定义切片

s := make([]string, 3)

map也是用make来的

m := make(map[string]int)  // 创建一个键是字符串类型,值是整数类型的 map

区别总结

区别var m map[string]intm := make(map[string]int)
声明方式只声明,没有初始化声明并且初始化
初始化mnil,未指向任何有效的内存地址m 是一个有效的空 map,可以直接使用
零值nil,不能直接使用,访问会导致运行时错误map,可以直接添加元素
适用场景用于声明一个变量,稍后再初始化或填充数据适用于直接创建并初始化一个可以使用的 map

定义JSON结构体

在Go中,只有导出的字段(首字母大写的字段)才能被外部包访问,或者在进行JSON序列化时使用。 类似这样,开头一定要大写,JSON结构体就是要这样,然后可以用json:"age"来创建和JSON的映射 也可以了解一下JSON的序列化Marshal啥的,还有UnMarshalMarshalInt这样之类的

读写数据

bufio

"bufio"包,bufio 是 Go 语言的标准库中的一个包,用于提供带缓冲的 I/O 操作

虽然 bufio 通过缓冲提高 I/O 操作的效率,但它并不直接创建流。它通常是与已有的流(如 os.Filenet.Connos.Stdin 等)一起使用的,提供更高效的读写方式。

reader := bufio.NewReader(os.Stdin) // 创建读取器

scanner := bufio.NewScanner(file) 
// 创建扫描器 
for scanner.Scan() { 
	// 按行扫描文件 
	line := scanner.Text() 
	fmt.Println("Scanned line:", line) 
}

一般情况下用bufio更好

Scanf和Scan

fmt.Scanf(format string, args ...interface{}) (n int, err error)

_, err := fmt.Scanf("%d", &guess) // `%d` 用于读取整数

表示读取到guess中 %v:读取任意类型的变量。

ScanScanf 的区别

  • fmt.Scanfmt.Scanf 都可以读取输入,但 fmt.Scanf 使用格式化字符串来指定输入的类型和顺序,而 fmt.Scan 是按空格、换行等分隔符来分隔输入。

panic运行恐慌

就是会直接终止程序并且抛出错误,和log,error啥的有很大区别,panic会直接终止程序

如果你希望在触发 panic 后恢复程序的执行,可以使用 recover 函数。recover 可以捕获 panic,防止程序直接崩溃。

go的协程

协程(goroutine) 是Go语言的一个重要语言特性,它是Go并发编程模型的核心。协程是Go运行时(runtime)提供的一种轻量级线程,允许你以非常简洁的方式进行并发编程。

内存小

  • 每个线程通常需要较大的栈内存(一般为1MB左右)
  • 但是启动一个协程的内存开销非常小(栈初始大小约为2KB),并且栈大小可以动态增长。由于协程是轻量级的,所以可以创建成千上万个协程而不消耗大量内存

管理与调度便利

  • 系统线程由操作系统管理和调度,不同操作系统的调度策略不同。线程之间的切换涉及到用户态和内核态的切换,开销较大
  • Go语言的协程由Go运行时的调度器管理,Go运行时会在少量的操作系统线程(称为M)上调度大量协程(G)。Go的调度器使用M模型,能够在多个线程上高效地调度大量协程。Go的调度切换是在用户态完成的,效率更高。

通信和同步

  • 在多线程环境中,线程之间的共享数据需要通过锁(如互斥锁)来保证同步,否则容易引发竞态条件问题
  • Go语言鼓励使用 “通过通信来共享内存,而且不是通过共享内存来通信” 的原则。Go语言中可以使用通道(channel)在协程间安全地传递数据,避免了大量的锁操作,提高了并发安全性和代码的可读性。

创建与销毁

  • 创建和销毁系统线程的开销相对较大,特别是频繁创建和销毁时,容易导致性能下降
  • 创建协程的开销较小,销毁也由Go运行时自动管理,GC(垃圾回收)会清理不再使用的协程