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
 
f1: hi世界
f2:
  f3: value
  f4: [42, 1024]
  f5: [a b]
  f6:
    f7: 77
    f8: ok

  

 
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 @ 2022-01-13 17:00  papering  阅读(222)  评论(0编辑  收藏  举报