go语言简单实现加载ini文件

本文参考自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实时翻译 ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116 查看详情 ViiTor实时翻译

package main

import "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")}

输出结果:

go语言简单实现加载ini文件

本文由仙士可原创,转载无需联系,但请注明来源于仙士可博客www.php20.cn。

以上就是go语言简单实现加载ini文件的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/387595.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
飞书文件同步异常如何处理
上一篇 2025年11月6日 14:22:26
PolyglotCode 已发布,但是
下一篇 2025年11月6日 14:22:35

相关推荐

发表回复

登录后才能评论
关注微信