初级会员
  • 第 41624 位会员
  • jfeng45
  • Jin Feng
  • 2019-08-14 08:32:36
  • Offline
  • 20 15

最近发布的主题

    暂无

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 要做到无侵入,这不是tracer的功能,这是logger的功能。你需要找到一个支持自动输出traceID的logger,但我并不知道有这样的logger存在。如果找不到,你可以自己写一个logger的封装,可参考[“清晰架构(Clean Architecture)的Go微服务: 日志管理”](https://jfeng45.github.io/posts/go_logging_and_error_handling/). 把Context作为参数传入logger的封装函数,然后在函数中从Context取出traceID并log它,再调用正常的logger函数。这样每一个调用logger封装函数的语句就会自动输出traceID。 但你还是需要在每个函数中访问Context,用依赖注入(Dependency Injection)是最好的办法。
  • 指针是Go的核心概念,也是主要难点之一。什么时候加”&“,什么时候加”*“,很容易搞混。 一个关键点是要区分定义时和使用时的区别。 * 什么时候用”*“? + 在定义指针类型时用 * 什么时候用”&“? + 在需要把实体转化为指针时 ( 从来不在定义时用”&“) * 为什么要把实体转化为指针? + 如果函数的参数和返回值是指针,而你现有的是实体(Dog{}), 那么你要先转换才能传递参数或返回(&Dog{}) * 在访问指针和实体的成员时有区别吗? + 没有,不论Dog{} 是实体还是指针,都可以用"Dog.Leg". 这是Go出众的设计,省去许多麻烦。 * 为什么要把函数的参数和返回值定义为指针? + 为了能在函数中修改参数的值 + 当返回值为空时,指针可以设为nil,很容易。实体要设为空值(结构体的空值),很麻烦。 + Go规定,当在结构体(struct)中定义方法(method)时, 每个方法有一个接受器(receiver)。对于一个结构的所有方法,要么接受器全是指针类型,要么接受器全是实体类型。所以一般的原则是都定义成指针类型。 * 除了定义时用"*", 还什么时候用它? + 当你已有指针类型,但需要返回实体类型,这时需要把指针转化为实体,要用”*“,相当于”&“的反操作。 另外一个与之相关的很重要概念”引用类型(reference type)“。在Go语言中,”map, channel, slice,interface“是引用类型,”array,struct“是值类型(value type). 引用类型类似指针,但不是指针,前面不能加”*“把它变成实体。这部分比较复杂,要想完全讲透需要写一篇文章。重点我已点出来了,你先慢慢体会。 另外关于学习Go语言,请看我的文章**”如何快速高效率地学习Go语言“(https://zhuanlan.zhihu.com/p/77999699)**, 或是我对["怎么学习 Golang?"](https://www.zhihu.com/question/23486344/answer/787113240)的回答.