gotests
Generate Go tests from your source code.
go get -u github.com/cweill/gotests/...gotests -h
<font size=1>
Usage of gotests: -all generate tests for all functions and methods -excl string regexp. generate tests for functions and methods that do not match. Takes precedence over -only, -exported, and -all -exported generate tests for exported functions and methods. Takes precedence over -only and -all -i print test inputs in error messages -nosubtests disable generating tests using the Go 1.7 subtests feature -only string regexp. generate tests for functions and methods that match only. Takes precedence over -all -parallel enable generating parallel subtests -template string optional. Specify custom test code templates, e.g. testify. This can also be set via environment variable GOTESTS_TEMPLATE -template_dir string optional. Path to a directory containing custom test code templates. Takes precedence over -template. This can also be set via environment variable GOTESTS_TEMPLATE_DIR -template_params string read external parameters to template by json with stdin -template_params_file string read external parameters to template by json with file -w write output to (test) files instead of stdout</font>
对 reverse.go:
package mainimport "fmt"//func main(){ fmt.Println(reverseString("dashen"))}// reverse for string.func reverseString(s string) string { rs := []rune(s) l := len(rs) for f, t := 0, l-1; f < t; f, t = f+1, t-1 { rs[f], rs[t] = rs[t], rs[f] } ns := string(rs) if l < 10 { for i := 0; i < 10-l; i++ { ns = ns + "0" } } return ns}执行 gotests -all ./
Generated Test_reverseStringpackage mainimport "testing"func Test_main(t *testing.T) { tests := []struct { name string }{ // TODO: Add test cases. } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { main() }) }}func Test_reverseString(t *testing.T) { type args struct { s string } tests := []struct { name string args args want string }{ // TODO: Add test cases. } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := reverseString(tt.args.s); got != tt.want { t.Errorf("reverseString() = %v, want %v", got, tt.want) } }) }}填充测试用例如下:
package mainimport "testing"func Test_reverseString(t *testing.T) { type args struct { s string } tests := []struct { name string args args want string }{ {"testcase1", args{"cuishuang"}, "gnauhsiuc0"}, {"testcase2", args{"dashen"}, "nehsad0000"}, // TODO: Add test cases. } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := reverseString(tt.args.s); got != tt.want { t.Errorf("reverseString() = %v, want %v", got, tt.want) } }) }}运行单元测试:
=== RUN Test_reverseString=== RUN Test_reverseString/testcase1=== RUN Test_reverseString/testcase2--- PASS: Test_reverseString (0.00s) --- PASS: Test_reverseString/testcase1 (0.00s) --- PASS: Test_reverseString/testcase2 (0.00s)PASS过程实现,并显示退出代码 0测试通过.
执行代码覆盖率测试如下:
go test -cover
PASScoverage: 90.0% of statementsok dashne 0.880s(更多参见 Go的测试覆盖率)
可见,应用该工具,能够主动生成绝大部分单元测试的代码~
guru
a tool for answering questions about Go source code.
[Using Go Guru:
an editor-integrated tool for navigating Go code](https://docs.google.com/document/d/1_Y9xCEMj5S-7rv2ooHpZNH15J...)
godepgraph
godepgraph is a program for generating a dependency graph of Go packages.
和go-callvis:极其好用的Go程序调用图生成工具相似
godepgraph -h
<font size=1>
go get github.com/kisielk/godepgraphUsage of godepgraph: -d (alias for -withgoroot) show dependencies of packages in the Go standard library -horizontal lay out the dependency graph horizontally instead of vertically -i string (alias for -ignorepackages) a comma-separated list of packages to ignore -ignorepackages string a comma-separated list of packages to ignore -ignoreprefixes string a comma-separated list of prefixes to ignore -l int (alias for -maxlevel) maximum level of the go dependency graph (default 256) -maxlevel int max level of go dependency graph (default 256) -nostdlib ignore packages in the Go standard library -novendor ignore packages in the vendor directory -o string (alias for -onlyprefixes) a comma-separated list of prefixes to include -onlyprefixes string a comma-separated list of prefixes to include -p string (alias for -ignoreprefixes) a comma-separated list of prefixes to ignore -s (alias for -nostdlib) ignore packages in the Go standard library -stoponerror stop on package import errors (default true) -t (alias for -withtests) include test packages -tags string a comma-separated list of build tags to consider satisfied during the build -withgoroot show dependencies of packages in the Go standard library -withtests include test packages</font>
godepgraph 某个文件或某个github我的项目
会生成文字版的援用关系
如 如对于b_sql.go, 代码如下:
package mainimport ( "fmt" "github.com/davecgh/go-spew/spew" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "time")func main() { db, err := gorm.Open("mysql", "root:12345678@/dashen?charset=utf8&parseTime=True&loc=Local") if err != nil { panic(err) } defer db.Close() books, err := GetBooksInfo(db, 0, 10, "*", "", "", "id < ? ", 126) spew.Println("books are:", books) books2, err2 := GetBooksInfo(db, 0, 10, "*", "", ",(select*from(select+sleep(2)union/**/select+1)a)", "id < ? ", 126) spew.Println("books2, err2", books2, err2)}type A struct { Id int `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"` Name string `gorm:"column:name" json:"name"` Book string `gorm:"column:book" json:"book"` CreateTime time.Time `gorm:"column:create_time;default:CURRENT_TIMESTAMP" json:"create_time"`}func (A) TableName() string { return "a"}func GetBooksInfo(db *gorm.DB, offset, limit int, field, order, sort, where string, params ...interface{}) (res []*A, err error) { db = db.Select(field).Where(where, params...) if order == "" { order = "create_time" } if sort == "" { sort = "DESC" } db = db.Order(order + " " + sort) if limit > 0 { db = db.Limit(limit) } if offset > 0 { db = db.Offset(offset) } err = db.Find(&res).Error if err != nil { fmt.Printf("GetBooksInfo error (%+v): where (%s), params (%+v)\n", err, where, params) return } if res == nil { fmt.Printf("GetBooksInfo empty: where (%s), params (%+v)\n", where, params) res = make([]*A, 0) } return}执行 godepgraph b_sql.go :
digraph godep {splines=orthonodesep=0.4ranksep=0.8node [shape="box",style="rounded,filled"]edge [arrowsize="0.5"]"b_sql.go" [label="b_sql.go" color="paleturquoise" URL="https://godoc.org/b_sql.go" target="_blank"];"b_sql.go" -> "fmt";"b_sql.go" -> "github.com/davecgh/go-spew/spew";"b_sql.go" -> "github.com/jinzhu/gorm";"b_sql.go" -> "github.com/jinzhu/gorm/dialects/mysql";"b_sql.go" -> "time";"bytes" [label="bytes" color="palegreen" URL="https://godoc.org/bytes" target="_blank"];"context" [label="context" color="palegreen" URL="https://godoc.org/context" target="_blank"];"crypto/rand" [label="crypto/rand" color="palegreen" URL="https://godoc.org/crypto/rand" target="_blank"];"crypto/rsa" [label="crypto/rsa" color="palegreen" URL="https://godoc.org/crypto/rsa" target="_blank"];"crypto/sha1" [label="crypto/sha1" color="palegreen" URL="https://godoc.org/crypto/sha1" target="_blank"];"crypto/sha256" [label="crypto/sha256" color="palegreen" URL="https://godoc.org/crypto/sha256" target="_blank"];"crypto/tls" [label="crypto/tls" color="palegreen" URL="https://godoc.org/crypto/tls" target="_blank"];"crypto/x509" [label="crypto/x509" color="palegreen" URL="https://godoc.org/crypto/x509" target="_blank"];"database/sql" [label="database/sql" color="palegreen" URL="https://godoc.org/database/sql" target="_blank"];"database/sql/driver" [label="database/sql/driver" color="palegreen" URL="https://godoc.org/database/sql/driver" target="_blank"];"encoding/binary" [label="encoding/binary" color="palegreen" URL="https://godoc.org/encoding/binary" target="_blank"];"encoding/hex" [label="encoding/hex" color="palegreen" URL="https://godoc.org/encoding/hex" target="_blank"];"encoding/json" [label="encoding/json" color="palegreen" URL="https://godoc.org/encoding/json" target="_blank"];"encoding/pem" [label="encoding/pem" color="palegreen" URL="https://godoc.org/encoding/pem" target="_blank"];"errors" [label="errors" color="palegreen" URL="https://godoc.org/errors" target="_blank"];"fmt" [label="fmt" color="palegreen" URL="https://godoc.org/fmt" target="_blank"];"github.com/davecgh/go-spew/spew" [label="github.com/davecgh/go-spew/spew" color="paleturquoise" URL="https://godoc.org/github.com/davecgh/go-spew/spew" target="_blank"];"github.com/davecgh/go-spew/spew" -> "bytes";"github.com/davecgh/go-spew/spew" -> "encoding/hex";"github.com/davecgh/go-spew/spew" -> "fmt";"github.com/davecgh/go-spew/spew" -> "io";"github.com/davecgh/go-spew/spew" -> "os";"github.com/davecgh/go-spew/spew" -> "reflect";"github.com/davecgh/go-spew/spew" -> "regexp";"github.com/davecgh/go-spew/spew" -> "sort";"github.com/davecgh/go-spew/spew" -> "strconv";"github.com/davecgh/go-spew/spew" -> "strings";"github.com/davecgh/go-spew/spew" -> "unsafe";"github.com/go-sql-driver/mysql" [label="github.com/go-sql-driver/mysql" color="paleturquoise" URL="https://godoc.org/github.com/go-sql-driver/mysql" target="_blank"];"github.com/go-sql-driver/mysql" -> "bytes";"github.com/go-sql-driver/mysql" -> "context";"github.com/go-sql-driver/mysql" -> "crypto/rand";"github.com/go-sql-driver/mysql" -> "crypto/rsa";"github.com/go-sql-driver/mysql" -> "crypto/sha1";"github.com/go-sql-driver/mysql" -> "crypto/sha256";"github.com/go-sql-driver/mysql" -> "crypto/tls";"github.com/go-sql-driver/mysql" -> "crypto/x509";"github.com/go-sql-driver/mysql" -> "database/sql";"github.com/go-sql-driver/mysql" -> "database/sql/driver";"github.com/go-sql-driver/mysql" -> "encoding/binary";"github.com/go-sql-driver/mysql" -> "encoding/pem";"github.com/go-sql-driver/mysql" -> "errors";"github.com/go-sql-driver/mysql" -> "fmt";"github.com/go-sql-driver/mysql" -> "io";"github.com/go-sql-driver/mysql" -> "log";"github.com/go-sql-driver/mysql" -> "math";"github.com/go-sql-driver/mysql" -> "math/big";"github.com/go-sql-driver/mysql" -> "net";"github.com/go-sql-driver/mysql" -> "net/url";"github.com/go-sql-driver/mysql" -> "os";"github.com/go-sql-driver/mysql" -> "reflect";"github.com/go-sql-driver/mysql" -> "sort";"github.com/go-sql-driver/mysql" -> "strconv";"github.com/go-sql-driver/mysql" -> "strings";"github.com/go-sql-driver/mysql" -> "sync";"github.com/go-sql-driver/mysql" -> "sync/atomic";"github.com/go-sql-driver/mysql" -> "syscall";"github.com/go-sql-driver/mysql" -> "time";"github.com/jinzhu/gorm" [label="github.com/jinzhu/gorm" color="paleturquoise" URL="https://godoc.org/github.com/jinzhu/gorm" target="_blank"];"github.com/jinzhu/gorm" -> "bytes";"github.com/jinzhu/gorm" -> "context";"github.com/jinzhu/gorm" -> "crypto/sha1";"github.com/jinzhu/gorm" -> "database/sql";"github.com/jinzhu/gorm" -> "database/sql/driver";"github.com/jinzhu/gorm" -> "encoding/json";"github.com/jinzhu/gorm" -> "errors";"github.com/jinzhu/gorm" -> "fmt";"github.com/jinzhu/gorm" -> "github.com/jinzhu/inflection";"github.com/jinzhu/gorm" -> "go/ast";"github.com/jinzhu/gorm" -> "log";"github.com/jinzhu/gorm" -> "os";"github.com/jinzhu/gorm" -> "reflect";"github.com/jinzhu/gorm" -> "regexp";"github.com/jinzhu/gorm" -> "runtime";"github.com/jinzhu/gorm" -> "sort";"github.com/jinzhu/gorm" -> "strconv";"github.com/jinzhu/gorm" -> "strings";"github.com/jinzhu/gorm" -> "sync";"github.com/jinzhu/gorm" -> "time";"github.com/jinzhu/gorm" -> "unicode";"github.com/jinzhu/gorm" -> "unicode/utf8";"github.com/jinzhu/gorm/dialects/mysql" [label="github.com/jinzhu/gorm/dialects/mysql" color="paleturquoise" URL="https://godoc.org/github.com/jinzhu/gorm/dialects/mysql" target="_blank"];"github.com/jinzhu/gorm/dialects/mysql" -> "github.com/go-sql-driver/mysql";"github.com/jinzhu/inflection" [label="github.com/jinzhu/inflection" color="paleturquoise" URL="https://godoc.org/github.com/jinzhu/inflection" target="_blank"];"github.com/jinzhu/inflection" -> "regexp";"github.com/jinzhu/inflection" -> "strings";"go/ast" [label="go/ast" color="palegreen" URL="https://godoc.org/go/ast" target="_blank"];"io" [label="io" color="palegreen" URL="https://godoc.org/io" target="_blank"];"log" [label="log" color="palegreen" URL="https://godoc.org/log" target="_blank"];"math" [label="math" color="palegreen" URL="https://godoc.org/math" target="_blank"];"math/big" [label="math/big" color="palegreen" URL="https://godoc.org/math/big" target="_blank"];"net" [label="net" color="palegreen" URL="https://godoc.org/net" target="_blank"];"net/url" [label="net/url" color="palegreen" URL="https://godoc.org/net/url" target="_blank"];"os" [label="os" color="palegreen" URL="https://godoc.org/os" target="_blank"];"reflect" [label="reflect" color="palegreen" URL="https://godoc.org/reflect" target="_blank"];"regexp" [label="regexp" color="palegreen" URL="https://godoc.org/regexp" target="_blank"];"runtime" [label="runtime" color="palegreen" URL="https://godoc.org/runtime" target="_blank"];"sort" [label="sort" color="palegreen" URL="https://godoc.org/sort" target="_blank"];"strconv" [label="strconv" color="palegreen" URL="https://godoc.org/strconv" target="_blank"];"strings" [label="strings" color="palegreen" URL="https://godoc.org/strings" target="_blank"];"sync" [label="sync" color="palegreen" URL="https://godoc.org/sync" target="_blank"];"sync/atomic" [label="sync/atomic" color="palegreen" URL="https://godoc.org/sync/atomic" target="_blank"];"syscall" [label="syscall" color="palegreen" URL="https://godoc.org/syscall" target="_blank"];"time" [label="time" color="palegreen" URL="https://godoc.org/time" target="_blank"];"unicode" [label="unicode" color="palegreen" URL="https://godoc.org/unicode" target="_blank"];"unicode/utf8" [label="unicode/utf8" color="palegreen" URL="https://godoc.org/unicode/utf8" target="_blank"];"unsafe" [label="unsafe" color="palegreen" URL="https://godoc.org/unsafe" target="_blank"];}配合dot命令生成调用关系图
➘
<font size=1 color="#00CED1">
dot命令是graphviz的一部分,通过编写一些相似脚本的语言,能够容易地生成流程图,
格局:dot -T<type> -o<outfile> <infile.dot>
输出文件是<infile.dot>,生成的格局由<type>指定,生成的文件是<outfile>。
其中-T<type>包含:
-Tps (PostScript),
-Tsvg -Tsvgz (Structured Vector Graphics),
-Tfig (XFIG graphics),
-Tmif (FrameMaker graphics),
-Thpgl (HP pen plotters),
-Tpcl (Laserjet printers),
-Tpng -Tgif (bitmap graphics),
-Tdia (GTK+ based diagrams),
-Timap (imagemap files for httpd servers for each node or edge that has a non-null "href" attribute.),
-Tcmapx (client-side imagemap for use in html and xhtml).
</font>
➚
godepgraph b_sql.go | dot -Tsvg -o shuang.svg
gomodifytags
参考 gomodifytags:好用的struct标签操作工具
goreturns
A gofmt/goimports-like tool for Go programmers that fills in Go return statements with zero values to match the func return types
填充办法返回类型的零值
package b_demoimport "errors"func F() (int, error) { return errors.New("foo") }goreturns 文件名.go
package b_demoimport "errors"func F() (int, error) { return 0, errors.New("foo") }depth
Visualize Go Dependency Trees
go get github.com/KyleBanks/depth/cmd/depth
depth -h
Usage of depth: -explain string If set, show which packages import the specified target -internal If set, resolves dependencies of internal (stdlib) packages. -json If set, outputs the depencies in JSON format. -max int Sets the maximum depth of dependencies to resolve. -test If set, resolves dependencies used for testing.depth 某个第三方库
depth -internal 某个官网规范库
如:
depth -internal strings:
strings ├ errors └ internal/reflectlite ├ runtime ├ internal/bytealg ├ internal/cpu └ unsafe ├ internal/cpu ├ runtime/internal/atomic └ unsafe ├ runtime/internal/math └ runtime/internal/sys ├ runtime/internal/sys └ unsafe └ unsafe ├ internal/bytealg ├ io ├ errors └ sync ├ internal/race └ unsafe ├ runtime ├ sync/atomic └ unsafe └ unsafe ├ sync ├ unicode ├ unicode/utf8 └ unsafe15 dependencies (15 internal, 0 external, 0 testing).又如:
depth -internal fmt:
fmt ├ errors └ internal/reflectlite ├ runtime ├ internal/bytealg ├ internal/cpu └ unsafe ├ internal/cpu ├ runtime/internal/atomic └ unsafe ├ runtime/internal/math └ runtime/internal/sys ├ runtime/internal/sys └ unsafe └ unsafe ├ internal/fmtsort ├ reflect ├ math ├ internal/cpu ├ math/bits └ unsafe └ unsafe ├ runtime ├ strconv ├ errors ├ internal/bytealg ├ math ├ math/bits └ unicode/utf8 ├ sync ├ internal/race └ unsafe ├ runtime ├ sync/atomic └ unsafe └ unsafe ├ unicode ├ unicode/utf8 └ unsafe └ sort └ internal/reflectlite ├ io ├ errors └ sync ├ math ├ os ├ errors ├ internal/oserror └ errors ├ internal/poll ├ errors ├ io ├ runtime ├ sync ├ sync/atomic ├ syscall ├ errors ├ internal/bytealg ├ internal/oserror ├ internal/race ├ runtime ├ sync └ unsafe ├ time ├ errors ├ runtime ├ sync ├ syscall └ unsafe └ unsafe ├ internal/syscall/execenv └ syscall ├ internal/syscall/unix ├ syscall └ unsafe ├ internal/testlog └ sync/atomic ├ io ├ runtime ├ sync ├ sync/atomic ├ syscall ├ time └ unsafe ├ reflect ├ strconv ├ sync └ unicode/utf829 dependencies (29 internal, 0 external, 0 testing).interface
实用价值不高~
safesql
SafeSQL是Go的动态剖析工具,能够避免SQL注入
可用来剖析我的项目中可能存在的sql注入隐患
aligncheck && structcheck && varcheck
go get -u gitlab.com/opennota/check/cmd/aligncheckgo get -u gitlab.com/opennota/check/cmd/structcheckgo get -u gitlab.com/opennota/check/cmd/varcheck<font size=1 color="orange">
新版本Go用 go install gitlab.com/opennota/check/cmd/aligncheck@latest 装置
</font>
找寻效率低下的构造体
能够是某个官网包,也能够是某个文件
golangci-lint里的 maligned也有该性能
Golang 的内存对齐
aligncheck net/http
失去:
net/http: /usr/local/opt/go@1.14/libexec/src/net/http/h2_bundle.go:1507:6: struct http2Framer could have size 200 (currently 216)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/h2_bundle.go:2274:6: struct http2HeadersFrameParam could have size 40 (currently 48)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/h2_bundle.go:4058:6: struct http2serverConn could have size 368 (currently 384)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/h2_bundle.go:4140:6: struct http2stream could have size 152 (currently 168)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/h2_bundle.go:5851:6: struct http2requestBody could have size 32 (currently 40)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/h2_bundle.go:6559:6: struct http2Transport could have size 80 (currently 88)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/h2_bundle.go:6698:6: struct http2ClientConn could have size 368 (currently 384)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/h2_bundle.go:6746:6: struct http2clientStream could have size 312 (currently 328)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/h2_bundle.go:9252:6: struct http2writeData could have size 32 (currently 40)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/h2_bundle.go:9335:6: struct http2writeResHeaders could have size 96 (currently 104)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/h2_bundle.go:9407:6: struct http2writePushPromise could have size 48 (currently 56)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/server.go:3294:6: struct timeoutWriter could have size 88 (currently 96)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/server.go:418:6: struct response could have size 200 (currently 224)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/server.go:653:6: struct connReader could have size 40 (currently 48)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/transfer.go:59:6: struct transferWriter could have size 128 (currently 152)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/transport.go:1103:6: struct wantConn could have size 168 (currently 176)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/transport.go:1768:6: struct persistConn could have size 264 (currently 280)net/http: /usr/local/opt/go@1.14/libexec/src/net/http/transport.go:95:6: struct Transport could have size 288 (currently 304)找到没有用到的构造体字段
structcheck --help
Usage of structcheck: -a Count assignments only -e Report exported fields -t Load test files too -tags string Build tagsstructcheck fmt
fmt: /usr/local/opt/go@1.14/libexec/src/fmt/scan.go:169:2: fmt.ssave.nlIsEndfmt: /usr/local/opt/go@1.14/libexec/src/fmt/scan.go:170:2: fmt.ssave.nlIsSpacefmt: /usr/local/opt/go@1.14/libexec/src/fmt/scan.go:171:2: fmt.ssave.argLimitfmt: /usr/local/opt/go@1.14/libexec/src/fmt/scan.go:172:2: fmt.ssave.limitfmt: /usr/local/opt/go@1.14/libexec/src/fmt/scan.go:173:2: fmt.ssave.maxWidfmt: /usr/local/opt/go@1.14/libexec/src/fmt/format.go:25:2: fmt.fmtFlags.precPresentfmt: /usr/local/opt/go@1.14/libexec/src/fmt/format.go:26:2: fmt.fmtFlags.minusfmt: /usr/local/opt/go@1.14/libexec/src/fmt/format.go:27:2: fmt.fmtFlags.plusfmt: /usr/local/opt/go@1.14/libexec/src/fmt/format.go:28:2: fmt.fmtFlags.sharpfmt: /usr/local/opt/go@1.14/libexec/src/fmt/format.go:30:2: fmt.fmtFlags.zerofmt: /usr/local/opt/go@1.14/libexec/src/fmt/format.go:24:2: fmt.fmtFlags.widPresentfmt: /usr/local/opt/go@1.14/libexec/src/fmt/format.go:35:2: fmt.fmtFlags.plusVfmt: /usr/local/opt/go@1.14/libexec/src/fmt/format.go:36:2: fmt.fmtFlags.sharpVfmt: /usr/local/opt/go@1.14/libexec/src/fmt/format.go:29:2: fmt.fmtFlags.space找到没有用到的全局变量和常量
varcheck --help
Usage of varcheck: -e Report exported variables and constants -tags string Build tagsvarcheck image/jpeg
image/jpeg: /usr/local/opt/go@1.14/libexec/src/image/jpeg/reader.go:74:2: adobeTransformYCbCrimage/jpeg: /usr/local/opt/go@1.14/libexec/src/image/jpeg/reader.go:75:2: adobeTransformYCbCrKimage/jpeg: /usr/local/opt/go@1.14/libexec/src/image/jpeg/writer.go:54:2: quantIndexLuminanceimage/jpeg: /usr/local/opt/go@1.14/libexec/src/image/jpeg/writer.go:55:2: quantIndexChrominanceimage/jpeg: /usr/local/opt/go@1.14/libexec/src/image/jpeg/writer.go:91:2: huffIndexLuminanceDCimage/jpeg: /usr/local/opt/go@1.14/libexec/src/image/jpeg/writer.go:92:2: huffIndexLuminanceACimage/jpeg: /usr/local/opt/go@1.14/libexec/src/image/jpeg/writer.go:93:2: huffIndexChrominanceDCimage/jpeg: /usr/local/opt/go@1.14/libexec/src/image/jpeg/writer.go:94:2: huffIndexChrominanceACeg
golang/tools
eg -h
Usage of eg: -beforeedit string A command to exec before each file is edited (e.g. chmod, checkout). Whitespace delimits argument words. The string '{}' is replaced by the file name. -help show detailed help message -t string template.go file specifying the refactoring -transitive apply refactoring to all dependencies too -v show verbose matcher diagnostics -w rewrite input files in place (by default, the results are printed to standard output)参考:
Go语言不齐全工具列表
golang/tools
代码主动实现(应用gocode)疾速提示信息(应用godef)跳转到定义(应用godef)搜寻参考援用(应用go-find-references)文件纲要(应用go-outline)重命名(应用gorename)保留构建(应用go build和go test)代码格式化(应用goreturns或goimports或gofmt)调试代码(应用delve)本文由mdnice多平台公布