最近看到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)
}