初级会员
  • 第 18021 位会员
  • jan-bar
  • janbar
  • 2018-04-21 11:54:32
  • 4
  • Online
  • 1 24 46

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • #5 @go2love go自带的pprof可以看到运行时执行过的方法调用链。这种静态分析我也只看到你提的这个额。
  • #3 @go2love 我和你情况一样的,我搞了个单文件的hello word打印,都报错。我也没辙了,你去GitHub提bug吧。
  • 评论了面试题 Go每日一题(5)
    @Dessert 我记得有一期的每日一题研究过`range`遍历,map的遍历是实时的,在遍历第1个元素时删除第2个元素,那么后续就不会遍历第2个元素。遍历第1个元素时删除第1个元素,后续更不会再出现第1个元素了。 https://go.dev/doc/effective_go#for, 这个官方例子也展示了可以在遍历的时候删除。 ![image.png](https://static.golangjob.cn/220923/2d31b234f61f9b55c1ec79f1e1d497e5.png) https://go.dev/ref/spec#For_statements, 同时官方的range迭代也有说着遍历时删除和新增的情况 ![image.png](https://static.golangjob.cn/220923/7a7bd664822e26524057441a9d68c8a0.png) 我感觉清空map还是直接用`m=make(map[string]string)`生成新对象,让GC清理旧map好点,因为map的delete并不会真的删除里面元素,貌似只是标记被删除,这个比较底层没深入研究,这时还是会占用一些内存吧。
  • 貌似我给了一个window可以编译成功的方法吧,linux编译按官方文档就可以成功。不过我window和linux都试了,GitHub文档里面那3个项目都没搞成功。 你可以试试go自带的`pprof`,这个可以生成火焰图那些图也有调用关系,只不过是在运行时执行过才行。
  • 当你执行下面代码会发现,第一个`a`把剩余所有字符串都获取了 ```go package main import ( "fmt" "log" ) func main() { var ( str = "a=aaa,b=bbb,c=ccc" format = "a=%s,b=%s,c=%s" a string b string c string ) if _, err := fmt.Sscanf(str, format, &a, &b, &c); err != nil { log.Println(err) } log.Println("a:", a) log.Println("b:", b) log.Println("c:", c) } 结果如下 2022/09/21 17:50:04 unexpected EOF 2022/09/21 17:50:04 a: aaa,b=bbb,c=ccc 2022/09/21 17:50:04 b: 2022/09/21 17:50:04 c: ``` 你可以增加空格,因为`scanf`默认都是已空格或者制表符之类的作为分隔,下面这种方式需要两种字符串都已空格分开 ```go package main import ( "fmt" "log" ) func main() { var ( str = "a=aaa ,b=bbb ,c=ccc" format = "a=%s ,b=%s ,c=%s" a string b string c string ) if _, err := fmt.Sscanf(str, format, &a, &b, &c); err != nil { log.Println(err) } log.Println("a:", a) log.Println("b:", b) log.Println("c:", c) } 结果如下 2022/09/21 17:54:58 a: aaa 2022/09/21 17:54:58 b: bbb 2022/09/21 17:54:58 c: ccc ``` 下面方法我将扫描分隔符改为逗号,完全满足你的需求 ```go package main import ( "fmt" "log" ) func main() { var ( str = "a=aaa,b=bbb,c=ccc" format = "a=%s,b=%s,c=%s" a, b, c string ) if _, err := fmt.Sscanf(str, format, (*mm)(&a), (*mm)(&b), (*mm)(&c)); err != nil { log.Println(err) } log.Println("a:", a) log.Println("b:", b) log.Println("c:", c) } type mm string func (m *mm) Scan(state fmt.ScanState, verb rune) error { tok, err := state.Token(true, func(r rune) bool { return r != ',' // 默认string以空格分隔,我这里改为用逗号分隔 }) if err != nil { return err } *m = mm(tok) return nil } 结果如下 2022/09/21 17:55:28 a: aaa 2022/09/21 17:55:28 b: bbb 2022/09/21 17:55:28 c: ccc ``` 我又修改了下,感觉把类型改为自定义使用起来比较麻烦。这下更完美了。 @Mericusta @yecz