コードの線


どのように多くの行のコードが我々のプロジェクトにあるかチェックするために、単純なカウンタを作りましょう.
シンプルな機能から始めたい.
func LineCounter(r string) (int, error) {

    var count int
    rr  := strings.Split(r, "\n")
    var rrr []string
    cc := 0
    comstart := false
    for _, str := range rr {
        if strings.HasPrefix(str, "/*")   {
            comstart = true
            continue
        }
        if strings.Contains(str, "*/") {
            comstart = false
            cc += 1

        }
        if (str != "" && !strings.HasPrefix(str, "//") && !comstart) {
            rrr = append(rrr, str)
        }
    }

    count = len(rrr) - cc

    return count, nil
}

この関数はいくつかのテキストを取り、\\n "(改行記号)で全ての行を分割します.
私たちは、ラインが空であるならば2つのものをチェックします、そして、線がどんな種類のコメントでもあるならば.Golangでは/で始まる行コメントもあります.この関数は、行またはエラーの数を返します.
var (
    Info = Teal
    Warn = Yellow
    Fata = Red
  )

  var (
    Black   = Color("\033[1;30m%s\033[0m")
    Red     = Color("\033[1;31m%s\033[0m")
    Green   = Color("\033[1;32m%s\033[0m")
    Yellow  = Color("\033[1;33m%s\033[0m")
    Purple  = Color("\033[1;34m%s\033[0m")
    Magenta = Color("\033[1;35m%s\033[0m")
    Teal    = Color("\033[1;36m%s\033[0m")
    White   = Color("\033[1;37m%s\033[0m")
  )

  func Color(colorString string) func(...interface{}) string {
    sprint := func(args ...interface{}) string {
      return fmt.Sprintf(colorString,
        fmt.Sprint(args...))
    }
    return sprint
  }

私たちが色のテキストを作成するために使用するコードのこの部分は私が推測説明を必要としません.
最後に、少なくとも我々は、主な機能があります.
func main() {
    arg := os.Args[1]
    all := 0

    err := filepath.Walk(arg, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        if (!info.IsDir()  && !strings.Contains(info.Name(), "test") ){
            ext := filepath.Ext(path)


            if ext == ".go" {

            jj, _ := os.ReadFile(path)
            g, _ := LineCounter(string(jj))
            all += g
            var u string
            if g < 200 {
                z := strconv.Itoa(g)
                u = Info(z)
            } 
            if g >= 200 && g < 1000 {
                z := strconv.Itoa(g)
                u = Warn(z)
            }
            if g >= 1000 {
                z := strconv.Itoa(g)
                u = Fata(z)
            }
            fmt.Printf("File %s have %s lines of code \n",path, u)
            }
        }

        return nil
    })
    if err != nil {
        log.Println(err)
    }
    fmt.Println("All lines", all)

}

ここでは、コンソールからのパスを取得し、パスがフォルダでないかどうかを再帰的にチェックします.パスがフォルダーでない場合(ファイルである)、ファイルが“go”拡張子を持つ場合.ファイル名が"test "の単語かどうかチェックします.テストファイルを数える必要はありません(Golangのテストファイルでは、名前の後にテストを入れなければなりません).
私は、我々のlinecounter機能が数を返すたびに、合計に加えます.200行以下の数が文字列に変換され、それがチアルになるか、200 - 1000黄色で、1000以上のすべてが赤であるかどうかを確認します.私も、線の数であらゆるファイルを印刷します.そして最後に、すべての行の合計を印刷します.
最後に完成したコード.
package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
    "strconv"
    "strings"
)

var (
    Info = Teal
    Warn = Yellow
    Fata = Red
  )

  var (
    Black   = Color("\033[1;30m%s\033[0m")
    Red     = Color("\033[1;31m%s\033[0m")
    Green   = Color("\033[1;32m%s\033[0m")
    Yellow  = Color("\033[1;33m%s\033[0m")
    Purple  = Color("\033[1;34m%s\033[0m")
    Magenta = Color("\033[1;35m%s\033[0m")
    Teal    = Color("\033[1;36m%s\033[0m")
    White   = Color("\033[1;37m%s\033[0m")
  )

  func Color(colorString string) func(...interface{}) string {
    sprint := func(args ...interface{}) string {
      return fmt.Sprintf(colorString,
        fmt.Sprint(args...))
    }
    return sprint
  }

func main() {
    arg := os.Args[1]
    all := 0

    err := filepath.Walk(arg, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        if (!info.IsDir()  && !strings.Contains(info.Name(), "test") ){
            ext := filepath.Ext(path)


            if ext == ".go" {

            jj, _ := os.ReadFile(path)
            g, _ := LineCounter(string(jj))
            all += g
            var u string
            if g < 200 {
                z := strconv.Itoa(g)
                u = Info(z)
            } 
            if g >= 200 && g < 1000 {
                z := strconv.Itoa(g)
                u = Warn(z)
            }
            if g >= 1000 {
                z := strconv.Itoa(g)
                u = Fata(z)
            }
            fmt.Printf("File %s have %s lines of code \n",path, u)

            }
        }

        return nil
    })
    if err != nil {
        log.Println(err)
    }
    fmt.Println("All lines", all)

}


func LineCounter(r string) (int, error) {

    var count int
    rr  := strings.Split(r, "\n")
    var rrr []string
    cc := 0
    comstart := false
    for _, str := range rr {
        if strings.HasPrefix(str, "/*")   {
            comstart = true
            continue
        }
        if strings.Contains(str, "*/") {
            comstart = false
            cc += 1

        }
        if (str != "" && !strings.HasPrefix(str, "//") && !comstart) {
            rrr = append(rrr, str)
        }
    }

    count = len(rrr) - cc

    return count, nil
}
私はいくつかのあなたの一部は、それがどのように動作し、また、Windowsシステム上で動作するかを教えてください.