第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何查看 Go 項目的大?。?/h1>

有沒有一種簡單的方法來檢查 Golang 項目的大?。克皇强蓤?zhí)行文件,而是我在自己的項目中導(dǎo)入的包。
查看完整描述

3 回答

?
慕森王

TA貢獻1777條經(jīng)驗 獲得超3個贊

您可以通過查看目錄來查看庫二進制文件有多大$GOPATH/pkg(如果$GOPATH未導(dǎo)出go則默認為$HOME/go)。


所以要檢查一些 http pkgs 的大小gorilla。首先安裝它們:


$ go get -u github.com/gorilla/mux

$ go get -u github.com/gorilla/securecookie

$ go get -u github.com/gorilla/sessions

我的 64 位 MacOS ( darwin_amd64) 上的 KB 二進制大?。?/p>


$ cd $GOPATH/pkg/darwin_amd64/github.com/gorilla/

$ du -k *


284 mux.a

128 securecookie.a

128 sessions.a

編輯:


庫(包)大小是一回事,但在鏈接階段后可執(zhí)行文件中占用的空間大小可能會有很大差異。這是因為包有自己的依賴關(guān)系,隨之而來的是額外的包袱,但這些包袱可能會被您導(dǎo)入的其他包共享。


一個例子最好地證明了這一點:


空去:


package main


func main() {}

http.go:


package main


import "net/http"


var _ = http.Serve


func main() {}

mux.go:


package main


import "github.com/gorilla/mux"


var _ = mux.NewRouter


func main() {}

所有 3 個程序在功能上都是相同的——執(zhí)行零用戶代碼——但它們的依賴關(guān)系不同。生成的二進制大小為KB:


$ du -k *


1028    empty

5812    http

5832    mux

這告訴我們什么?核心 go pkgnet/http顯著增加了我們的可執(zhí)行文件的大小。pkgmux本身并不大,但它對 net/httppkg 具有導(dǎo)入依賴性 - 因此它的文件大小也很大。mux然而和之間的差異http僅為20KB,而列出的 mux.a 庫文件大小為284KB. 所以我們不能簡單地添加庫 pkg 大小來確定它們的真實足跡。


結(jié)論: 在構(gòu)建過程中,go 鏈接器會從各個庫中剝離大量包袱,但為了真正了解導(dǎo)入某些包的額外重量,我們必須查看 pkg 的所有子依賴項出色地。


查看完整回答
反對 回復(fù) 2023-06-12
?
交互式愛情

TA貢獻1712條經(jīng)驗 獲得超3個贊

package main


import (

? ? "flag"

? ? "fmt"

? ? "log"

? ? "os"

? ? "sort"


? ? "golang.org/x/tools/go/packages"

)


func main() {

? ? flag.Parse()


? ? // Many tools pass their command-line arguments (after any flags)

? ? // uninterpreted to packages.Load so that it can interpret them

? ? // according to the conventions of the underlying build system.

? ? cfg := &packages.Config{Mode: packages.NeedFiles |

? ? ? ? packages.NeedSyntax |

? ? ? ? packages.NeedImports,

? ? }

? ? pkgs, err := packages.Load(cfg, flag.Args()...)

? ? if err != nil {

? ? ? ? fmt.Fprintf(os.Stderr, "load: %v\n", err)

? ? ? ? os.Exit(1)

? ? }

? ? if packages.PrintErrors(pkgs) > 0 {

? ? ? ? os.Exit(1)

? ? }


? ? // Print the names of the source files

? ? // for each package listed on the command line.

? ? var size int64

? ? for _, pkg := range pkgs {

? ? ? ? for _, file := range pkg.GoFiles {

? ? ? ? ? ? s, err := os.Stat(file)

? ? ? ? ? ? if err != nil {

? ? ? ? ? ? ? ? log.Println(err)

? ? ? ? ? ? ? ? continue

? ? ? ? ? ? }

? ? ? ? ? ? size += s.Size()

? ? ? ? }

? ? }

? ? fmt.Printf("size of %v is %v b\n", pkgs[0].ID, size)


? ? size = 0

? ? for _, pkg := range allPkgs(pkgs) {

? ? ? ? for _, file := range pkg.GoFiles {

? ? ? ? ? ? s, err := os.Stat(file)

? ? ? ? ? ? if err != nil {

? ? ? ? ? ? ? ? log.Println(err)

? ? ? ? ? ? ? ? continue

? ? ? ? ? ? }

? ? ? ? ? ? size += s.Size()

? ? ? ? }

? ? }

? ? fmt.Printf("size of %v and deps is %v b\n", pkgs[0].ID, size)

}


func allPkgs(lpkgs []*packages.Package) []*packages.Package {

? ? var all []*packages.Package // postorder

? ? seen := make(map[*packages.Package]bool)

? ? var visit func(*packages.Package)

? ? visit = func(lpkg *packages.Package) {

? ? ? ? if !seen[lpkg] {

? ? ? ? ? ? seen[lpkg] = true


? ? ? ? ? ? // visit imports

? ? ? ? ? ? var importPaths []string

? ? ? ? ? ? for path := range lpkg.Imports {

? ? ? ? ? ? ? ? importPaths = append(importPaths, path)

? ? ? ? ? ? }

? ? ? ? ? ? sort.Strings(importPaths) // for determinism

? ? ? ? ? ? for _, path := range importPaths {

? ? ? ? ? ? ? ? visit(lpkg.Imports[path])

? ? ? ? ? ? }


? ? ? ? ? ? all = append(all, lpkg)

? ? ? ? }

? ? }

? ? for _, lpkg := range lpkgs {

? ? ? ? visit(lpkg)

? ? }

? ? return all

}


查看完整回答
反對 回復(fù) 2023-06-12
?
森欄

TA貢獻1810條經(jīng)驗 獲得超5個贊

您可以使用 下載所有imported 模塊,然后計算所有不是測試文件的文件go mod vendor的行數(shù):.go


package main


import (

   "bytes"

   "fmt"

   "io/fs"

   "os"

   "os/exec"

   "path/filepath"

   "strings"

)


func count(mod string) int {

   imp := fmt.Sprintf("package main\nimport _ %q", mod)

   os.WriteFile("size.go", []byte(imp), os.ModePerm)

   exec.Command("go", "mod", "init", "size").Run()

   exec.Command("go", "mod", "vendor").Run()

   var count int

   filepath.WalkDir("vendor", func(s string, d fs.DirEntry, err error) error {

      if strings.HasSuffix(s, ".go") && !strings.HasSuffix(s, "_test.go") {

         data, err := os.ReadFile(s)

         if err != nil {

            return err

         }

         count += bytes.Count(data, []byte{'\n'})

      }

      return nil

   })

   return count

}


func main() {

   println(count("github.com/klauspost/compress/zstd"))

}


查看完整回答
反對 回復(fù) 2023-06-12
  • 3 回答
  • 0 關(guān)注
  • 267 瀏覽
慕課專欄
更多

添加回答

了解更多

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號