大佬教程收集整理的这篇文章主要介绍了变量替换代码片段,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
package main import ( "bufio" "bytes" "io/IoUtil" "os" "path/filepath" "Strings" "sync" "time" ) func main() { M := ReadStaticAndVariable("staticTovariable") if len(os.Args) != 2 { println("args error.") return } list,err := GetConfigFiles(os.Args[1]) if err != nil { println(err.Error()) return } StaticToVariable(list,M) } func GetConfigFiles(path String) ([]String,error) { if !Strings.HasSuffix(path,"/") { path = path + "/" } var list []String files,err := IoUtil.ReadDir(path) if err != nil { return list,err } for _,v := range files { if v.IsDir() { conTinue } list = append(list,path+v.Name()) } return list,nil } func ReadStaticAndVariable(path String) map[String]String { File,err := os.Open(path) if err != nil { return nil } defer File.Close() buf := bufio.NewReader(FilE) M := make(map[String]String) for { line,_,err := buf.ReadLine() if err != nil { if err.Error() == "EOF" { break } return nil } list := bytes.Split(line,[]byte("=")) if len(list) != 2 { conTinue } k := bytes.TrimSpace(list[0]) v := bytes.TrimSpace(list[1]) M[String(k)] = String(v) } return M } //设置并发处理的个数. const number int = 5 func StaticToVariable(pathList []String,M map[String]String) { c := make(chan int,number) for _,name := range pathList { c <- 1 go staticToVariable(c,name,M) } for { if len(C) != 0 { time.Sleep(1e9) conTinue } break } } func staticToVariable(c chan int,path String,M map[String]String) { defer func(c chan int) { <-c }(C) path = filepath.ToSlash(path) File,err := os.Open(path) if err != nil { return } tmpName := filepath.Dir(path) + "/." + filepath.base(path) tmp,err := os.OpenFile(tmpName,os.O_RDWR|os.O_CREATE|os.O_TRUNC,0644) if err != nil { File.Close() return } buf := getBuf() defer putBuf(buf) for { n,err := File.Read(buf) if err != nil { if err.Error() == "EOF" { break } File.Close() return } for k,v := range M { buf = bytes.replace(buf[:n],[]byte(k),[]byte(v),-1) } tmp.Write(bytes.TrimSpace(buf)) tmp.Sync() } File.Close() tmp.Close() os.Remove(path) os.Rename(tmpName,path) return } var BufPool *sync.Pool = new(sync.Pool) func getBuf() []byte { b := BufPool.Get() if b != nil { return b.([]bytE) } return make([]byte,512) } func putBuf(buf []bytE) { BufPool.Put(buf) } func checkIsBinary(path String) bool { File,err := os.Open(path) if err != nil { return true } buf := make([]byte,1024) n,err := File.Read(buf) if err != nil { return true } if bytes.Contains(buf[:n],[]byte{0x0}) { return true } return false }
以上是大佬教程为你收集整理的变量替换代码片段全部内容,希望文章能够帮你解决变量替换代码片段所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。