map[interface {}]interface {} yaml文件解码 检查类型断言

解析json、yaml文件
 
DsnDG : user:pwd@tcp(ip:portr)/db?charset=utf8mb4
 
 
 
type MysqlConfig struct {
    DsnDG string `yaml:"DsnDG"`
}

// config should be a pointer to structure, if not, panic
func loadJsonConfig() *MysqlConfig {
    workPath, err := os.Getwd()
    if err != nil {
        panic(err)
    }
    configPath := filepath.Join(workPath, "conf")
    log.Println("configPath: ", configPath)
    fullPath := filepath.Join(configPath, "db.yaml")
    log.Println(fullPath)
    file, err := os.Open(fullPath)
    if err != nil {
        msg := fmt.Sprintf("Can not load config at %s. Error: %v", fullPath, err)
        panic(msg)
    }
    defer file.Close()
    var bs []byte
    bs, err = os.ReadFile(fullPath)
    if err != nil {
        panic(err)
    }
    config := &MysqlConfig{}
    err = yaml.Unmarshal(bs, &config)
    if err != nil {
        panic(err)
    }
    return config
}
 
{
    "topic":"a2",
    "group.id":"go_dev",
    "bootstrap.servers":"alikafka-pre-cn-st21wg28xxxx-1-vpc.alikafka.aliyuncs.com:9094,alikafka-pre-cn-st21wg28xxxx-2-vpc.alikafka.aliyuncs.com:9094,alikafka-pre-cn-st21wg28xxxx-3-vpc.alikafka.aliyuncs.com:9094",
    "security.protocol":"sasl_plaintext",
    "sasl.mechanism":"PLAIN",
    "sasl.username":"SASL_PLAINTEXT_dg_go",
    "sasl.password":"xxxxF$184354D20%A7F1Bent_de5F6A*301DF2D7"
    }
     
 
 
type KafkaConfig struct {
    Topic            string `json:"topic"`
    GroupId          string `json:"group.id"`
    BootstrapServers string `json:"bootstrap.servers"`
    SecurityProtocol string `json:"security.protocol"`
    SaslMechanism    string `json:"sasl.mechanism"`
    SaslUsername     string `json:"sasl.username"`
    SaslPassword     string `json:"sasl.password"`
}
 
 
 
 
 
 
// config should be a pointer to structure, if not, panic
func loadJsonConfig() *KafkaConfig {
    workPath, err := os.Getwd()
    if err != nil {
        panic(err)
    }
    configPath := filepath.Join(workPath, "conf")
    log.Println("configPath: ", configPath)
    fullPath := filepath.Join(configPath, "kafka.json")
    file, err := os.Open(fullPath)
    if err != nil {
        msg := fmt.Sprintf("Can not load config at %s. Error: %v", fullPath, err)
        panic(msg)
    }

    defer file.Close()

    decoder := json.NewDecoder(file)
    var config = &KafkaConfig{}
    err = decoder.Decode(config)
    if err != nil {
        msg := fmt.Sprintf("Decode json fail for config file at %s. Error: %v", fullPath, err)
        panic(msg)
    }
    json.Marshal(config)
    return config
}
 
 
 
 
 
map[interface {}]interface {}
 
map[interface{}]interface{} on a map[string]interface{} · Issue #139 · go-yaml/yaml https://github.com/go-yaml/yaml/issues/139
 
1
2
3
4
5
6
7
8
f1: hi世界
f2:
  f3: value
  f4: [42, 1024]
  f5: [a b]
  f6:
    f7: 77
    f8: ok

  

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package main
 
import (
    "fmt"
    "io/ioutil"
 
    "gopkg.in/yaml.v3"
)
 
func main() {
    var err error
    m := make(map[string]interface{})
    var bs []byte
    bs, err = ioutil.ReadFile("a.yaml")
    if err != nil {
        panic(err)
    }
    err = yaml.Unmarshal(bs, &m)
    if err != nil {
        panic(err)
    }
    f1v := m["f1"].(string)
    var f3v string
    var f4v []int
    var f5v []string
    var f6v map[string]interface{}
 
    for k, v := range m["f2"].(map[string]interface{}) {
        switch k {
        case "f3":
            f3v = v.(string)
        case "f4", "f5":
            l := v.([]interface{})
            if k == "f4" {
                for _, u := range l {
                    f4v = append(f4v, u.(int))
                }
            }
            if k == "f5" {
                for _, u := range l {
                    f5v = append(f5v, u.(string))
                }
            }
        case "f6":
            f6v = v.(map[string]interface{})
        default:
        }
    }
     
    fmt.Println("---->", f1v, f3v, f4v, f5v, f6v)
}

  

 

go run *go
----> hi世界 value [42 1024] [a b] map[f7:77 f8:ok]

 

 2)

the-way-to-go_ZH_CN/11.3.md at master · unknwon/the-way-to-go_ZH_CN · GitHub https://github.com/unknwon/the-way-to-go_ZH_CN/blob/master/eBook/11.3.md

通常我们可以使用 类型断言 来测试在某个时刻 varI 是否包含类型 T 的值:

v := varI.(T)       // unchecked type assertion

varI 必须是一个接口变量,否则编译器会报错:invalid type assertion: varI.(T) (non-interface type (type of varI) on left) 。

类型断言可能是无效的,虽然编译器会尽力检查转换是否有效,但是它不可能预见所有的可能性。如果转换在程序运行时失败会导致错误发生。更安全的方式是使用以下形式来进行类型断言:

if v, ok := varI.(T); ok {  // checked type assertion
    Process(v)
    return
}
// varI is not of type T

如果转换合法,v 是 varI 转换到类型 T 的值,ok 会是 true;否则 v 是类型 T 的零值,ok 是 false,也没有运行时错误发生。

应该总是使用上面的方式来进行类型断言。

多数情况下,我们可能只是想在 if 中测试一下 ok 的值,此时使用以下的方法会是最方便的:

if _, ok := varI.(T); ok {
    // ...
}

 

 

 

 

 

 

 
 
 
 
posted @   papering  阅读(231)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2021-01-13 map数据结构
2020-01-13 适配器模式 桥接模式
2020-01-13 android时序图
2020-01-13 Cuckoo Hashing
2018-01-13 /var/lib/mysql/mysql.sock
2018-01-13 双层for 循环
2018-01-13 序列化 serialize
点击右上角即可分享
微信分享提示