Fred

学习是反复的事情

Fred's Github chart

100.习题练习

O、内存相关 下列程序为什么会卡死(测试不会被卡死) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package main import ( "fmt" "runtime" ) func main() { var i byte go func() { for i = 0; i <= 255; i++ {} }() fmt.Println("Dropping mic") // Yield execution to force executing other goroutines runtime.Gosched() runtime.GC() fmt.Println("Done") } 解析: Golang 中,byte 其实被 alias 到 uint8 上了。所以上⾯的 for 循环会始终成⽴,因为 i++ 到 i=255 的时候会溢出,i <= 255 ⼀定成⽴。 也即是, for 循环永远⽆法退出,所以上

22.go与http代理

网络代理 1. 网络代理&网络转发 网络代理 用户通过代理请求信息 请求通过网络代理完成转发到达目标服务器 目标服务器相应后再通过网络代理回传给用户 用户不直接连接服务器,网络代理去连接。获取数据后返回给用户 网络转发 客户端访问公网服务器,数据包在网络上传输时会经过至少一个路由器,对于多个/多层路由,会进行网

21.go编译参数netgo

什么是netgo Go语言的网络库是基于操作系统提供的系统调用(syscall)实现的。在大多数现代操作系统上,这些系统调用都是由C语言实现的,经过高度优化,性能非常好。但在某些特殊的架构或操作系统上,系统网络调用可能无法正常工作,或者效率较低。 为了解决这个可移植性问题,Go语言还提供了一个纯Go实现

20.go调用lib和so动态库

go 调用dll 1. sysCall.LoadDll(推荐使用) 系统调用是程序向操作系统内核请求服务的过程,通常包含硬件相关的服务(例如访问硬盘),创建新进程等。系统调用提供了一个进程和操作系统之间的接口 fmt中的syscall 1 2 3 4 5 func Println(a ...interface{}) (n int, err error) { return Fprintln(os.Stdout, a...) } Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout") 调用dll 示例 1 2 3 4 dll, err := syscall.LoadDLL("scan.dll") //根据

19.cgo教程

官方文档: https://pkg.go.dev/cmd/cgo 参考:https://zhuanlan.zhihu.com/p/349197066、https://juejin.cn/post/7047405294107754533、https://pkg.go.dev/cmd/cgo 初识 cgo Cgo是Go语言中的一个工具,它允许在Go代码中直接调用C语

18. 标准库container三剑客:head、list、ring

Heap - 堆 1. Heap - 堆 堆分为两种:最大堆和最小堆,两者的差别在于节点的排序方式 堆是一棵完全树(complete tree):即除了最底层,其他层的节点都被元素填满,且最底层尽可能地从左到右填入 在最大堆中,父节点的值比每一个子节点的值都要大。在最小堆中,父节点的值比每一个子节点的值都要小。这就是所谓的“堆属性”

17. go执行外部命令

1 执行外部命令 1.1 1. 方式一:run code 1 2 3 4 5 6 7 func main() { cmd := exec.Command("ls", "-l", "/var/log/") err := cmd.Run() if err != nil { log.Fatalf("cmd.Run() failed with %s\n", err) } } Run() 方法会启动命令并等待命令执行完毕。它会阻塞当前 goroutine 直到命令执行完毕,并返回一个 error 对象,该对象表示命令执行的错误信息。如果命令执行成功,Run() 方法会返回 nil 直接调用 Cmd 对象的 Run 函数,返回的只有成功和失败,获取

16. Go runtime详解

runtime 包 提供了运行时与系统的交互,比如控制协程函数,触发垃圾立即回收等等底层操作; 1 runtime.GOARCH 获取 GOARCH 信息 1 fmt.Println(runtime.GOARCH) // arm64 2 runtime.GOOS 获取 GOOS 信息 1 fmt.Println(runtime.GOOS) // darwin 3 runtime.GOROOT() 获取goroot环境变量 func GOROOT() string 1 2 3 4 5 6 7 8 9 10 11 12 package main import ( "fmt" "runtime" ) func main() { fmt.Println(runtime.GOROOT()) // /Users/liusaisai/.g/go fmt.Println(runtime.GOARCH) // arm64 fmt.Println(runtime.GOOS) // darwin } 4 runtime.Version() 获取go版本 1 2 3 4 5 6 7 8 9 10 11 package main import ( "fmt" "runtime" ) func main() { fmt.Println(runtime.Version()) //go1.18 } 5 runtime.NumCPU() 获取机器cp

15. Go 切片的截取

1 截取容量问题 切片截取子切片时,会造成临时内存泄露, 主要原因有两个 切片截取时,新旧切片会共用一个底层数组 切片的底层结构体指向数组的指针只是一个头指针 demo 1 2 3 4 5 6 7 8 9 package main import "fmt" func main() { a := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} c := a[1:2] fmt.Println(len(c), cap(c)) // 1,9 c的数组头指针执行索引1,所以容量为9 } 解决办法 使用copy,不过要注意copy

14.位运算

1 itoa 位运算 code-1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package main import "fmt" const ( i=1<<iota j=3<<iota k l ) func main() { fmt.Println("i=",i) fmt.Println("j=",j) fmt.Println("k=",k) fmt.Println("l=",l) } /* i= 1 j= 6 k= 12 l= 24 */ const 声明第一个常量必须指定一个表达式,后续的常量如果没有表达式,则继承上面的表达式。 iota 表示从 0 开始自动加 1,所以 i=1«0, j=3«1(« 表示左移的意思),即:i=1, j=6
0%