Golang实现Redis(2):读取redis配置文件

最近看到github上大神用golang实现的Redis,那我最近也有类似的需求,我尝试着看大神的代码,然后实现出来,在这里也跟大家推荐一下,源码地址是https://github.com/HDT3213/godis

func main() {
	config.SetupConfig("redis.conf")
}
package config

import (
	"bufio"
	"fmt"
	"log"
	"os"
	"reflect"
	"strconv"
	"strings"
)

type PropertyHolder struct {
	Bind			string	`cfg:"bind"`
	Port			int		`cfg:"port"`
	AppendOnly		bool	`cfg:"appendOnly"`
	AppendFileName	string	`cfg:"appendFileName"`
	MaxClients		int		`cfg:"maxClients"`
	Peers			[]string `cfg:"peers"`
	Self			string	 `cfg:"self"`
}

var Properties *PropertyHolder

func init()  {
	// 默认配置
	Properties = &PropertyHolder{
		Bind: "127.0.0.1",
		Port: 6379,
		AppendOnly: false,
	}
}

func loadConfig(configFileName string) *PropertyHolder {

	config := Properties

	file, err := os.Open(configFileName)
	//这个意思就是文件不存在,就直接返回默认配置
	if err != nil {
		log.Print(err)
		return config
	}
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {
			log.Print("关闭文件失败")
		}
	}(file)

	//开始读取文件
	rawMap := make(map[string]string)
	//这个就是把文件读到缓冲区
	scanner := bufio.NewScanner(file)
	// 把文件里数据逐行读取出来的 读完放到map里
	for scanner.Scan() {
		//读取到的每一行数据
		line := scanner.Text()
		//每行数据长度>0 && 是以#开头的 说明是注释 跳过这行
		if len(line) > 0 && line[0] == '#' {
			continue
		}

		pivot := strings.IndexAny(line, " ")
		if pivot > 0 {
			key := line[0:pivot]
			value := strings.Trim(line[pivot+1:], " ")
			rawMap[strings.ToLower(key)] = value
		}
		fmt.Println("pivot",pivot)
	}

	//反射获取 key value
	t := reflect.TypeOf(config)
	v := reflect.ValueOf(config)
	n := t.Elem().NumField()

	for i:=0; i<n; i++ {
		field := t.Elem().Field(i)
		fieldVal := v.Elem().Field(i)
		key, ok :=field.Tag.Lookup("cfg")
		if !ok {
			key = field.Name
		}
		value,ok:= rawMap[strings.ToLower(key)]
		if ok {
			switch field.Type.Kind() {
			case reflect.String:
				fieldVal.SetString(value)
			case reflect.Int:
				intValue, err := strconv.ParseInt(value, 10, 64)
				if err == nil {
					fieldVal.SetInt(intValue)
				}
			case reflect.Bool:
				boolValue := "yes" == value
				fieldVal.SetBool(boolValue)
			case reflect.Slice:
				if field.Type.Elem().Kind() == reflect.String {
					slice := strings.Split(value, ",")
					fieldVal.Set(reflect.ValueOf(slice))
				}
			}

		}
	}

	return config

}

func SetUpConfig(configFileName string)  {
	Properties = loadConfig(configFileName)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值