查看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]int | m := make(map[string]int) |
|---|---|---|
| 声明方式 | 只声明,没有初始化 | 声明并且初始化 |
| 初始化 | m 是 nil,未指向任何有效的内存地址 | m 是一个有效的空 map,可以直接使用 |
| 零值 | nil,不能直接使用,访问会导致运行时错误 | 空 map,可以直接添加元素 |
| 适用场景 | 用于声明一个变量,稍后再初始化或填充数据 | 适用于直接创建并初始化一个可以使用的 map |
定义JSON结构体
在Go中,只有导出的字段(首字母大写的字段)才能被外部包访问,或者在进行JSON序列化时使用。
类似这样,开头一定要大写,JSON结构体就是要这样,然后可以用json:"age"来创建和JSON的映射
也可以了解一下JSON的序列化Marshal啥的,还有UnMarshal和MarshalInt这样之类的
读写数据
bufio
用"bufio"包,bufio 是 Go 语言的标准库中的一个包,用于提供带缓冲的 I/O 操作
虽然 bufio 通过缓冲提高 I/O 操作的效率,但它并不直接创建流。它通常是与已有的流(如 os.File、net.Conn、os.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:读取任意类型的变量。
Scan 和 Scanf 的区别:
fmt.Scan和fmt.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(垃圾回收)会清理不再使用的协程