结构体tag快速补全

  1. 填写相关信息

image.png

  1. 编辑你定义的变量

image.png
camelCase(fieldName()) 即为变量明的驼峰命名

  1. 最后一步

image.png

ps : json默认在Go 与 Go Struct Tags里都有,我们因删除Go里面的json
另外,json默认的是snakeCase(fieldName()) 即为变量明的蛇形命名,我们改一下
image.png

使用技巧:ALT + SHIFT + 鼠标左键添加多个光标,先给一个空格,然后输入json 按下tab键

  1. type P struct {
  2. NameA string `json:"nameA"`
  3. NameB string `json:"nameB"`
  4. NameC string `json:"nameC"`
  5. NameD string `json:"nameD"`
  6. }

注释

  1. 设置

    1. /**
    2. * @Author jiangwei
    3. * @MethodName: //TODO
    4. * @Description //TODO
    5. * @Param //TODO
    6. * @return //TODO
    7. * @Date $time$ $date$
    8. **/

    image.png

  2. 配置区域,直接全选Go

image.png

  1. 使用,jw + tab 或 jw + enter

image.png

设置模板内容

找到 Go File 添加如下内容 即可,注意最后又一个空行

  1. /*
  2. * @Time : ${YEAR}年${MONTH}月${DAY}日 ${HOUR}:${MINUTE}:${SECOND}
  3. * @Author : ${USER}
  4. * @Project : ${PROJECT_NAME}
  5. * @File : ${FILE_NAME}
  6. * @Software: ${PRODUCT_NAME}
  7. * @Describe:
  8. */

image.png

代码测试

goland能够很方便的生成测试文件
举例:
tools.go

  1. package testing
  2. func Add(n int) int {
  3. res := 0
  4. for i := 1; i <= n; i++ {
  5. res += 1
  6. }
  7. return res
  8. }

image.png
image.png

会在同目录下生成xxx_test.go文件
image.png
缺点是无法做基准测试,只能自己在该文件中实现了image.png

代码检查

image.png
image.png
image.png

image.png

revive配置

  1. # https://github.com/mgechev/revive/
  2. ignoreGeneratedHeader = false
  3. severity = "warning"
  4. confidence = 0.8
  5. errorCode = 1
  6. warningCode = 1
  7. # 入参个数限制
  8. [rule.argument-limit]
  9. arguments =[4]
  10. # 检查常见的sync/atomic包不正确用法
  11. [rule.atomic]
  12. # 裸返回
  13. [rule.bare-return]
  14. # 禁用的字符(不检查注释)
  15. [rule.banned-characters]
  16. arguments =["Ω","Σ","σ"]
  17. # 空白导入
  18. [rule.blank-imports]
  19. # 逻辑表达式中使用布尔文字 ( true, false) 可能会降低代码的可读性
  20. # 此规则建议从逻辑表达式中删除布尔文字。
  21. [rule.bool-literal-in-expr]
  22. # 显式调用垃圾收集器是非常可疑的,除了在基准测试中的特定用途。
  23. [rule.call-to-gc]
  24. # 认知复杂性
  25. [rule.cognitive-complexity]
  26. arguments =[7]
  27. # struct名称仅因大小写而异的方法或字段可能会造成混淆
  28. [rule.confusing-naming]
  29. # 返回多个相同类型的无命名值的函数或方法可能会导致错误
  30. [rule.confusing-results]
  31. # 规则会发现计算结果始终为相同值的逻辑表达式
  32. [rule.constant-logical-expr]
  33. # 按照惯例,context.Context应该是函数的第一个参数
  34. [rule.context-as-argument]
  35. # 基本类型不应用作context.WithValue
  36. [rule.context-keys-type]
  37. # 圈复杂度是代码复杂度的度量。强制每个函数的最大复杂度有助于保持代码的可读性和可维护性。
  38. [rule.cyclomatic]
  39. arguments =[3]
  40. # 这条规则警告使用defer语句时的一些常见错误
  41. # call-chain 即使foo()()形式的延迟调用链是有效的,它也无助于理解代码
  42. # loop 延迟内部循环可能会引起误解
  43. # method-call 如果方法没有指针接收器,延迟对方法的调用可能会导致微妙的错误
  44. # recover 在延迟函数外调用recover没有效果
  45. # return 从延迟函数中返回值是没有作用的
  46. [rule.defer]
  47. arguments=[["call-chain","loop"]]
  48. # 导入 with.使程序更难理解,因为不清楚名称是属于当前包还是导入包。
  49. [rule.dot-imports]
  50. # 可能会无意中两次导入同一个包。此规则查找导入两次或多次的包。
  51. [rule.duplicated-imports]
  52. # 在 GO 中,尽量减少嵌套语句是惯用的做法
  53. [rule.early-return]
  54. # 空块使代码可读性降低,并且可能是错误或未完成重构的征兆。
  55. [rule.empty-block]
  56. # 有时gofmt不足以强制执行代码库的通用格式;
  57. [rule.empty-lines]
  58. # 按照惯例,为了可读性,类型变量error必须以前缀命名err。
  59. [rule.error-naming]
  60. # 按照惯例,为了可读性,错误应该在函数返回值列表的最后。
  61. [rule.error-return]
  62. # 按照惯例,为了更好的可读性,错误消息不应大写或以标点符号或换行符结尾
  63. [rule.error-strings]
  64. # 可以通过更换得到一个简单的程序errors.New(fmt.Sprintf())用fmt.Errorf()
  65. [rule.errorf]
  66. # 导出的函数和方法应该有注释。这会警告未记录的导出函数和方法。
  67. # checkPrivateReceivers启用检查私有类型的公共方法
  68. [rule.exported]
  69. arguments =["checkPrivateReceivers","disableStutteringCheck"]
  70. # 项目中的所有源文件强制实施通用标头
  71. [rule.file-header]
  72. arguments =["This is the text that must appear at the top of source files."]
  73. # 返回过多结果的函数可能难以理解/使用。
  74. [rule.function-result-limit]
  75. arguments =[3]
  76. # 函数太长(有很多语句和/或行)可能难以理解
  77. # 检查超过 10 条语句的函数,不会检查函数的行数
  78. [rule.function-length]
  79. arguments =[10,0]
  80. # 通常,名称以Get为前缀的函数应该返回一个值。
  81. [rule.get-return]
  82. # if-then-else在两个分支中具有相同实现的条件是错误的。
  83. [rule.identical-branches]
  84. # 检查错误是否为nil到返回错误或 nil 是多余的
  85. [rule.if-return]
  86. # 发现了像i += 1,i -= 1并建议将它们改为i++、i--
  87. [rule.increment-decrement]
  88. # 为了提高代码的可读性,建议尽量减少缩进。该规则突出显示了可以从代码中消除的冗余else 块。
  89. [rule.indent-error-flow]
  90. # 导入列入黑名单的包时发出警告
  91. [imports-blacklist]
  92. arguments =["crypto/md5", "crypto/sha1"]
  93. # 当代码行超过配置的最大值时发出警告。
  94. [rule.line-length-limit]
  95. arguments =[80]
  96. # 声明过多公共结构的包可能难以理解/使用,并且可能是不良设计的征兆。
  97. [rule.max-public-structs]
  98. arguments =[3]
  99. # 修改接收器值的方法可能会出现不希望的行为。修改也可能是错误的根源,
  100. # 因为实际值接收器可能是调用站点使用的值的副本。当方法修改其接收器时,此规则会发出警告。
  101. [rule.modifies-parameter]
  102. # 声明包含其他内联结构定义的结构的包对于其他开发人员来说可能难以理解/阅读。
  103. [rule.nested-structs]
  104. # 最短路径
  105. [rule.optimize-operands-order]
  106. # 包应该有注释。此规则对未记录的包以及当包注释与package关键字分离时发出警告。
  107. [rule.package-comments]
  108. # 此规则建议使用更短的方式来编写不使用第二个值的范围
  109. [rule.range]
  110. # 循环中的范围变量在每次迭代时都被重用;因此,在循环中创建的 goroutine 将指向范围变量从上范围。
  111. # 这样,goroutine 就可以使用带有不需要的值的变量。
  112. # 当在闭包中使用范围值(或索引)时,此规则会发出警告
  113. [rule.range-val-in-closure]
  114. # 循环中的范围变量在每次迭代中都被重用。当分配变量的地址、将地址传递给 append()
  115. # 或在映射中使用它时,此规则会发出警告。
  116. [rule.range-val-address]
  117. # 按照惯例,方法中的接收者名称应该反映他们的身份。例如,如果接收器的类型为Parts,p就是它的适当名称。
  118. # 与其他语言相反,将接收者命名为this或并不习惯self。
  119. [rule.receiver-naming]
  120. # 常量名如false, true, nil,函数名如append,make和基本类型名如bool;
  121. # 因此可以重新定义。即使可能,重新定义这些内置名称也会导致很难检测到的错误。
  122. [rule.redefines-builtin-id]
  123. # 显式类型转换string(i),其中i是整数类型,可能不符合开发人员的预期(例如string(42)不是"42")
  124. [rule.string-of-int]
  125. # 在编译时不检查结构标记。
  126. # 此规则检查并警告是否在常见结构标记类型中发现错误,例如:asn1、default、json、protobuf、xml、yaml
  127. [rule.struct-tag]
  128. # 为了提高代码的可读性,建议尽量减少缩进。该规则突出显示了可以从代码中消除的冗余else 块
  129. [rule.superfluous-else]
  130. # 当时间类型使用==和!=进行相等性检查时,发出警告,建议使用time.time.Equal
  131. [rule.time-equal]
  132. # 当使用"Secs", "Mins", ... 等后缀为time.Duration进行命名时,可能产生误导
  133. [rule.time-naming]
  134. # 当不遵循变量或包命名约定时,此规则会发出警告。
  135. # 此规则接受两个字符串切片,一个白名单和一个初始值黑名单。
  136. [rule.var-naming]
  137. arguments = [["ID"], ["VM"]]
  138. # 该规则建议简化变量声明
  139. [rule.var-declaration]
  140. # 无条件递归调用会产生无限递归,从而导致程序堆栈溢出。此规则检测并警告无条件(直接)递归调用。
  141. [rule.unconditional-recursion]
  142. # 此规则警告错误命名的未导出符号,即名称以大写字母开头的未导出符号。
  143. [rule.unexported-naming]
  144. # 当导出的函数或方法返回未导出类型的值时,此规则会发出警告。
  145. [rule.unexported-return]
  146. # 当函数返回的错误未在调用方明确处理时,此规则会发出警告。
  147. [rule.unhandled-error]
  148. arguments =["fmt.Printf", "myFunction"]
  149. # 此规则建议删除breakcase 块末尾的 a等冗余语句,以提高代码的可读性。
  150. [rule.unnecessary-stmt]
  151. # 此规则发现并建议删除无法访问的代码。
  152. [rule.unreachable-code]
  153. # 此规则警告未使用的参数。带有未使用参数的函数或方法可能是未完成重构或错误的征兆。
  154. [rule.unused-parameter]
  155. # 此规则警告未使用的方法接收器。带有未使用接收器的方法可能是未完成重构或错误的征兆。
  156. [rule.unused-receiver]
  157. # sync.WaitGroup不能做值传递
  158. [rule.waitgroup-by-value]

推荐配置

  1. ignoreGeneratedHeader = false
  2. severity = "warning"
  3. confidence = 0.8
  4. errorCode = 0
  5. warningCode = 0
  6. [rule.blank-imports]
  7. [rule.context-as-argument]
  8. [rule.context-keys-type]
  9. [rule.dot-imports]
  10. [rule.error-return]
  11. [rule.error-strings]
  12. [rule.error-naming]
  13. [rule.exported]
  14. [rule.if-return]
  15. [rule.increment-decrement]
  16. [rule.var-naming]
  17. [rule.var-declaration]
  18. [rule.package-comments]
  19. [rule.range]
  20. [rule.receiver-naming]
  21. [rule.time-naming]
  22. [rule.unexported-return]
  23. [rule.indent-error-flow]
  24. [rule.errorf]
  25. [rule.empty-block]
  26. [rule.superfluous-else]
  27. [rule.unused-parameter]
  28. [rule.unreachable-code]
  29. [rule.redefines-builtin-id]

在配置文件中加了规则,也可以在代码中取消
例如:对xxx函数不做cyclomatic检测

  1. // revive:disable:cyclomatic
  2. func xxx() {
  3. }