Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了变量替换代码片段大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

代码片段分享


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,请注明来意。