over
parent
af01ec1951
commit
d4aef966b6
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -3,6 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"reflect"
|
"reflect"
|
||||||
|
@ -18,21 +19,21 @@ type MysqlConfig struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type RedisConfig struct {
|
type RedisConfig struct {
|
||||||
host string `ini:"host"`
|
Host string `ini:"host"`
|
||||||
Port int `ini:"port"`
|
Port int `ini:"port"`
|
||||||
Password string `ini:"password"`
|
Password string `ini:"password"`
|
||||||
Database string `ini:"database"`
|
Database string `ini:"database"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
RedisConfig `ini:"mysql"`
|
MysqlConfig `ini:"mysql"`
|
||||||
MysqlConfig `ini:"redis"`
|
RedisConfig `ini:"redis"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func Loadini(fileName string, data interface{}) (err error) {
|
func Loadini(fileName string, data interface{}) (err error) {
|
||||||
//0.参数的校验,对函数中修改值,必须是结构体指针
|
//0.参数的校验,对函数中修改值,必须是结构体指针
|
||||||
t := reflect.TypeOf(data)
|
t := reflect.TypeOf(data)
|
||||||
//v := reflect.ValueOf(data)
|
v := reflect.ValueOf(data)
|
||||||
//校验指针类型
|
//校验指针类型
|
||||||
if t.Kind() != reflect.Ptr {
|
if t.Kind() != reflect.Ptr {
|
||||||
err = fmt.Errorf("data should be pointer")
|
err = fmt.Errorf("data should be pointer")
|
||||||
|
@ -51,11 +52,15 @@ func Loadini(fileName string, data interface{}) (err error) {
|
||||||
|
|
||||||
lineSlice := strings.Split(string(b), "\r\n") //字节类型的数据按照换行符切分
|
lineSlice := strings.Split(string(b), "\r\n") //字节类型的数据按照换行符切分
|
||||||
fmt.Printf("%#v\n", lineSlice)
|
fmt.Printf("%#v\n", lineSlice)
|
||||||
//var structName string
|
var structName string
|
||||||
//2.一行一行的读取数据
|
//2.一行一行的读取数据
|
||||||
for idx, line := range lineSlice {
|
for idx, line := range lineSlice {
|
||||||
//2.1如果是注释,就跳过
|
//2.1如果是注释,就跳过
|
||||||
line = strings.TrimSpace(line)
|
line = strings.TrimSpace(line)
|
||||||
|
//校验:跳过空行
|
||||||
|
if len(line) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if strings.HasPrefix(line, ";") || strings.HasPrefix(line, "#") {
|
if strings.HasPrefix(line, ";") || strings.HasPrefix(line, "#") {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -78,16 +83,64 @@ func Loadini(fileName string, data interface{}) (err error) {
|
||||||
field := t.Elem().Field(i)
|
field := t.Elem().Field(i)
|
||||||
if field.Tag.Get("ini") == sectionName {
|
if field.Tag.Get("ini") == sectionName {
|
||||||
//找到对应的嵌套结构体
|
//找到对应的嵌套结构体
|
||||||
//structName = field.Name
|
structName = field.Name
|
||||||
break
|
fmt.Printf("找到%s对应的嵌套结构体%s\n", sectionName, structName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//2.3如果不是[,就是=分割的键值对
|
//2.3如果不是[,就是=分割的键值对
|
||||||
|
//校验:不能不存在等号或者以等号开头
|
||||||
|
if strings.Index(line, "=") == -1 || strings.HasPrefix(line, "=") {
|
||||||
|
err = fmt.Errorf("line:%d syntax error", idx+1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//1.以等号分割这一行,等号左边是key,等号右边是value
|
||||||
|
|
||||||
|
//2.根据structName去data里把对应的嵌套结构体取出
|
||||||
|
subValue := v.Elem().FieldByName(structName)
|
||||||
|
subType := subValue.Type()
|
||||||
|
if subValue.Kind() != reflect.Struct {
|
||||||
|
err = fmt.Errorf("field:%s is not struct", structName)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//切分line这一行,左边是key 右边是value
|
||||||
|
key := strings.Split(line, "=")[0]
|
||||||
|
value := strings.Split(line, "=")[1]
|
||||||
|
|
||||||
|
//3.遍历嵌套结构体的每一个字段,判断tag是不是等于key,如果等于key,给这个字段赋值
|
||||||
|
|
||||||
|
var fieldName string
|
||||||
|
for i := 0; i < subType.NumField(); i++ {
|
||||||
|
field := subType.Field(i)
|
||||||
|
if field.Tag.Get("ini") == key {
|
||||||
|
fieldName = field.Name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//根据fieldName取出 这个字段,对其赋值
|
||||||
|
fieldObj := subValue.FieldByName(fieldName)
|
||||||
|
fmt.Println(fieldName, fieldObj.Type().Kind())
|
||||||
|
switch fieldObj.Type().Kind() {
|
||||||
|
case reflect.String:
|
||||||
|
fieldObj.SetString(value)
|
||||||
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||||
|
valueInt, err := strconv.ParseInt(value, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
err = fmt.Errorf("line:%d value:%s error", idx+1, value)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fieldObj.SetInt(valueInt)
|
||||||
|
case reflect.Bool:
|
||||||
|
valueBool, err := strconv.ParseBool(value)
|
||||||
|
if err != nil {
|
||||||
|
err = fmt.Errorf("line:%d value:%s error", idx+1, value)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fieldObj.SetBool(valueBool)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return //
|
return
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,5 +151,5 @@ func main() {
|
||||||
fmt.Println("load ini error:", err)
|
fmt.Println("load ini error:", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Println(cfg)
|
fmt.Printf("%#v", cfg)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
; mysql config
|
; mysql config
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[mysql]
|
[mysql]
|
||||||
address=1.2.3.4
|
address=1.2.3.4
|
||||||
port=3306
|
port=3306
|
||||||
|
@ -9,10 +12,12 @@ password=pass
|
||||||
|
|
||||||
# [
|
# [
|
||||||
#[ ]
|
#[ ]
|
||||||
|
|
||||||
|
|
||||||
# redis config
|
# redis config
|
||||||
[redis]
|
[redis]
|
||||||
host=127.0.0.1
|
host=127.0.0.1
|
||||||
port=6379
|
port=6370
|
||||||
password=root
|
password=root
|
||||||
database=0
|
database=0
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue