Go Trace

Q1:请使用 runtime/trace 包,写一个使用trace的例子 启动两个goroutine,记录trace func main() { f, err := os.Create("trace.out") if err != nil { log.Fatalf("failed to create trace file: %v", err) } defer f.Close() if err := trace.Start(f); err != nil { log.Fatalf("failed to start trace: %v", err) } defer trace.Stop() var wg sync.WaitGroup wg.Add(2) go wait(&wg) go sum(&wg) wg.Wait() } func wait(wg *sync.WaitGroup) { defer wg.Done() time.Sleep(2 * time.Second) } func sum(wg *sync.WaitGroup) { defer wg.Done() i, s := 0, 0 ch := time....

May 29, 2024 · 1 min · LwQ

Go插件的使用

Q1:说明 go plugin 使用场景,并编写一个使用 plugin 的 demo Go plugin支持将Go包编译为共享库(.so)的形式单独发布,主程序可以在运行时动态加载这些编译为动态共享库文件的go plugin,从中提取导出(exported)变量或函数的符号并在主程序的包中使用。Go plugin的这种特性为Go开发人员提供更多的灵活性,我们可以用之实现支持热插拔的插件系统。 demo 通过不同插件实现io.StringWriter,可将输出保存到不同地方 plugin/plugin.go package main import ( "fmt" "log" "os" ) func init() { log.Println("stdoutStringWriter init") } type stdoutStringWriter struct{} func (w *stdoutStringWriter) WriteString(s string) (n int, err error) { return fmt.Fprint(os.Stdout, s) } var StringWriter stdoutStringWriter main.go package main import ( "io" "log" "plugin" ) func main() { log.SetFlags(log.Lshortfile | log.LstdFlags) p, err := plugin.Open("./plugin/plugin.so") if err != nil { panic(err) } w, err := p....

May 29, 2024 · 1 min · LwQ