本文参考自github上的一个项目,详细介绍了如何使用go语言解析和生成ini文件。以下是示例ini文件、结构体定义、解析代码、序列化代码以及调用示例的伪原创版本。
示例INI文件:
# 注释; 注释; 注释[redis]ip = 127.0.0.1port = 8080
[mysql]host = 127.0.0.1port = 3300database = testuser = rootpassword = 123456timeout = 30
结构体定义:
type RedisConfig struct {Ip string ini:"ip"Port int ini:"port"
}
type MysqlConfig struct {Host string
ini:"host"
Port int
ini:"port"
Database string
ini:"database"
User string
ini:"user"
Password string
ini:"password"
Timeout int
ini:"timeout"
}
type Config struct {RedisConfig RedisConfig
ini:"redis"
MysqlConfig MysqlConfig
ini:"mysql"
}
解析INI文件的代码:
func unMarshalFile(fileName string, result interface{}) (err error) {data, err := ioutil.ReadFile(fileName)if err != nil {return err}err = UnMarshal(data, result)if err != nil {return err}return}func UnMarshal(data []byte, result interface{}) (err error) {typeInfo := reflect.TypeOf(result)if typeInfo.Kind() != reflect.Ptr {return nil}if typeInfo.Elem().Kind() != reflect.Struct {return nil}lineArr := strings.Split(string(data), "\n")var myFieldName stringfor _, line := range lineArr {line = strings.TrimSpace(line)if len(line) == 0 || line[0] == ';' || line[0] == '#' {continue}if line[0] == '[' {myFieldName, err = myLabel(line, typeInfo.Elem())if err != nil {return}continue}err = myField(myFieldName, line, result)if err != nil {return}}return}
func myLabel(line string, typeInfo reflect.Type) (fieldName string, err error) {labelName := line[1 : len(line)-1]for i := 0; i < typeInfo.NumField(); i++ {field := typeInfo.Field(i)tag := field.Tag.Get("ini")if tag == labelName {fieldName = field.Namereturn}}err = fmt.Errorf("未找到标签:%s", labelName)return}
func myField(myFieldName string, line string, result interface{}) (err error) {typeInfo := reflect.TypeOf(result).Elem()valueInfo := reflect.ValueOf(result).Elem()fieldIndex := -1for i := 0; i < typeInfo.NumField(); i++ {field := typeInfo.Field(i)tag := field.Tag.Get("ini")if tag == strings.Split(line, "=")[0] {fieldIndex = ibreak}}if fieldIndex == -1 {return fmt.Errorf("未找到字段:%s", strings.Split(line, "=")[0])}fieldValue := valueInfo.Field(fieldIndex)switch fieldValue.Kind() {case reflect.String:fieldValue.SetString(strings.Split(line, "=")[1])case reflect.Int:intValue, := strconv.Atoi(strings.Split(line, "=")[1])fieldValue.SetInt(int64(intValue))}return}
结构体序列化的代码:
立即学习“go语言免费学习笔记(深入)”;
func MarshalFile(filename string, data interface{}) (err error) {result, := Marshal(data)err = ioutil.WriteFile(filename, result, 0666)return err}func Marshal(data interface{}) (result []byte, err error) {typeInfo := reflect.TypeOf(data)valueInfo := reflect.ValueOf(data)if typeInfo.Kind() != reflect.Struct {return}var conf []stringfor i := 0; i < typeInfo.NumField(); i++ {field := typeInfo.Field(i)tag := field.Tag.Get("ini")if tag != "" {conf = append(conf, fmt.Sprintf("[%s]", tag))fieldValue := valueInfo.Field(i)switch fieldValue.Kind() {case reflect.Struct:subTypeInfo := fieldValue.Type()subValueInfo := fieldValuefor j := 0; j < subTypeInfo.NumField(); j++ {subField := subTypeInfo.Field(j)subTag := subField.Tag.Get("ini")if subTag != "" {subFieldValue := subValueInfo.Field(j)switch subFieldValue.Kind() {case reflect.String:conf = append(conf, fmt.Sprintf("%s=%s", subTag, subFieldValue.String()))case reflect.Int:conf = append(conf, fmt.Sprintf("%s=%d", subTag, subFieldValue.Int()))}}}}}}result = []byte(strings.Join(conf, "\n"))return}
调用示例:
ViiTor实时翻译
AI实时多语言翻译专家!强大的语音识别、AR翻译功能。
116 查看详情
package mainimport "fmt"
func main() {var conf Config = unMarshalFile("./config.ini", &conf)fmt.Printf("成功解析文件 config:%#v\n port:%#v\n", conf, conf.RedisConfig.Port)conf2 := Config{RedisConfig{Ip: "127.0.0.1", Port: 6379},MysqlConfig{Host: "127.0.0.1", User: "root", Password: "123456"},} = MarshalFile("1.ini", conf2)fmt.Printf("成功序列化文件\n")}
输出结果:

本文由仙士可原创,转载无需联系,但请注明来源于仙士可博客www.php20.cn。
以上就是go语言简单实现加载ini文件的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/387595.html
赞 (0)
打赏
微信扫一扫
支付宝扫一扫
微信扫一扫
支付宝扫一扫