变量替换代码片段

代码片段分享


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
}


要在VSCode中配置代码片段,可以按照以下步骤进行操作: 1. 首先,点击左下角的设置图标,然后选择"用户代码片段"(user snippets)。如果找不到该选项,可以通过右上角的文件菜单选择"首选项",然后再选择"配置用户代码片段"。 2. 在弹出的菜单中,选择你想要配置代码片段的语言,比如JavaScript、Python等。 3. 选择语言后,会打开一个代码片段模板文件。在这个文件中,可以定义你自己的代码片段。 4. 代码片段文件的格式是JSON。每个代码片段由一个唯一的名称、一个前缀(用于触发代码片段的快捷键)和一段代码组成。 5. 在定义代码片段时,可以使用一些特殊的变量,比如$1、$2等。这些变量表示代码片段中的占位符,方便你在使用代码片段时进行快速替换。 6. 定义完代码片段后,保存文件。 7. 现在,你可以在编写代码的时候使用你刚刚配置的代码片段了。只需要输入代码片段的前缀,然后按下Tab键即可自动插入代码片段。 通过配置代码片段,你可以在开发时快速输入重复使用的代码,提高开发效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [VSCode 如何配置用户代码片段](https://blog.csdn.net/qq_57152807/article/details/129022293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值