golang json:怎么替代yaml:安装EasyDataTransform在Mac上就可以解决 。
安装EasyDataTransform在Mac上,开始轻松的数据转换,将要显示重复项的Excel电子表格拖到EasyDataTransform上 。将添加一个粉红色的输入项请注意右侧窗格中的JSON数据已自动“展平”到表格中 。
您可以将右窗格中的Format下拉菜单设置为Long或Wide,具体取决于您希望表格具有更多行还是更多列,确保选择了粉红色的输入项,单击左窗格中的ToFile按钮,将出现一个窗口 。设置新文件名和位置 。选择YAML文件作为文件类型 。添加并选择了一个绿色输出项 。YAML文件会立即创建,无需“运行”任何内容您可以在右侧窗格中更改YAML文件编码 。
34.Go YAMLYAML是一种流行的格式,用于以人类友好的格式序列化数据, 类似JSON但更易于阅读 。
由于其表达能力和可读性,YAML作为配置文件的格式很受欢迎 。
它也用于更复杂的场景中,例如推动Ansible服务器自动化 。
标准库中没有用于处理YAML格式的软件包,但是社区库包括gopkg.in/yaml.v2
将YAML文件读取到Go结构中:
YAML:
YAML解码与JSON解码非常相似 。
如果你知道YAML文件的结构,则可以定义映射该结构的结构,并将指向顶级结构的结构的指针传递给yaml.Decoder.Decode()函数(或从[]进行解码的yaml.Unmarshal()) 。字节片) 。
YAML解码器在结构字段名称和YAML文件中的名称之间进行智能映射,以便 YAML中的名称值被解码为结构中的字段名称 。
最好使用yaml struct标签创建显式映射 。我仅在示例中省略了它们,以说明未指定它们时的行为 。
将struct写入YAML文件:
yaml.Marshal将interface {}作为参数 。可以传递任何Go值 , 并将其类型包装到interface {}中 。
Marshaller将使用反射检查传递的值并将其编码为YAML字符串 。
在序列化结构时 , 仅对导出的字段(其名称以大写字母开头)进行序列化/反序列化 。
在我们的示例中 , 未对fullName进行序列化 。
结构被序列化为YAML字典 。默认情况下,字典键与结构字段名称相同 。
结构字段名称在字典键名称下序列化 。
我们可以提供带有struct标签的自定义映射 。
我们可以将任意的struct标签字符串附加到struct字段 。
yaml:“ age”指示YAML编码器/解码器将名称age用于表示字段Age的字典关键字 。
序列化结构时 , 将值和指针传递给它会产生相同的结果 。
传递指针效率更高 , 因为按值传递会创建不必要的副本 。
Golang项目中引入yaml.v2配置文件 在Go语言项目中 , 常用的配置文件yaml、toml、json、xml、ini几种,因为本章主要讲解yaml配置文件的使用方法,其他几种配置文件在这里就不展开了介绍了,大家有兴趣可以自行百度 。
yaml文件的语法网上有很多的教程,大家自行百度,这里也推荐两个链接:
yaml文件解析使用的是github上第三方开源框架 gopkg.in/yaml.v2,下面详细介绍安装和使用的方法:
参考链接:
Go中标签的用途是什么?字段标签允许您将元信息附加到可以使用反射获取的字段上 。通常,它用于提供有关如何将结构域编码为另一种格式(或从另一种格式存储(或从数据库中检索))的转换信息 , 但是您可以使用它存储想要存储的任何元信息,这些元信息既可以用于另一种包装或供您自己使用 。
如的文档所述reflect.StructTag , 按照惯例,标记字符串的值是用空格分隔的key:"value"成对列表,如:
type User struct {
Name string `json:"name" xml:"name"`
}
的key通常表示包,随后的"value"是,如json密钥被处理/使用的encoding/json包 。
如果要在中传递多个信息"value",通常通过用逗号(',')隔开来指定它,如
Name string `json:"name,omitempty" xml:"name"`
通常用破折号('-')"value"表示将字段从过程中排除(如,在这种情况下,json表示不封送或取消封送该字段) 。
使用反射访问自定义标签的示例
我们可以使用反射(reflect包)来访问结构字段的标记值 。基本上,我们需要获取Type结构的 , 然后可以使用Type.Field(i
int)或查询字段Type.FieldByName(name
string) 。这些方法返回的值StructField描述/表示一个struct字段;并且StructField.Tag是StructTag描述/表示标记值的类型值 。
以前我们谈论过 “惯例”。该公约的手段,如果你遵循它 , 你可以使用StructTag.Get(key
string)它解析变量的值,并返回该方法"value"的key指定 。该公约实施/内置到这个Get()方法 。如果不遵守约定,Get()将无法解析key:"value"对并找到您要查找的内容 。这也不是问题,但是随后您需要实现自己的解析逻辑 。
还有StructTag.Lookup()(在Go1.7中添加了),它 “类似于,Get()但是将不包含给定键的标签与将空字符串与给定键相关联的标签区分开” 。因此,看一个简单的示例:
type User struct {
Namestring `mytag:"MyName"`
Email string `mytag:"MyEmail"`}
u := User{"Bob", "bob@mycompany.com"}
t := reflect.TypeOf(u)for _, fieldName := range []string{"Name", "Email"} {
field, found := t.FieldByName(fieldName)if !found {continue
}
fmt.Printf("\nField: User.%s\n", fieldName)
fmt.Printf("\tWhole tag value : %q\n", field.Tag)
fmt.Printf("\tValue of 'mytag': %q\n", field.Tag.Get("mytag"))
}
输出(在Go Playground上尝试):
Field: User.Name
Whole tag value : "mytag:\"MyName\""
Value of 'mytag': "MyName"Field: User.Email
Whole tag value : "mytag:\"MyEmail\""
Value of 'mytag': "MyEmail"
GopherCon 2015上有一个关于struct标签的演示,名为:结构标签的许多面孔(幻灯片)
(和视频)以下是常用标签键的列表:
json-由encoding/json包装使用,详细说明json.Marshal()
xml-由encoding/xml包装使用,详细说明xml.Marshal()
bson-由gobson使用,详细说明bson.Marshal()
protobuf-由github.com/golang/protobuf/proto,在软件包doc中有详细说明
yaml-由gopkg.in/yaml.v2包装使用,详细说明yaml.Marshal()
db-由github.com/jmoiron/sqlx包装使用;也被github.com/go-gorp/gorp包装使用
orm-由github.com/astaxie/beego/orm包装使用,在“ 型号– Beego ORM”中有详细说明
gorm-由github.com/jinzhu/gorm软件包使用 , 示例可在其文档中找到:模型
valid-由github.com/asaskevich/govalidator软件包使用,示例可以在项目页面中找到
datastore-由appengine/datastore(Google App Engine平台,数据存储区服务)使用,在“ 属性”中有详细说明
schema-用于通过HTML表单值github.com/gorilla/schema填充(struct包文档中有详细说明)
asn-由encoding/asn1包装使用,详细说明在asn1.Marshal()和asn1.Unmarshal()
csv-由github.com/gocarina/gocsv包装使用
C语言操作yaml配置文件通用操作工具在go语言中使用viper之类的库很方便的处理yaml配置文件go语言解析yaml , 但是在c语言中就比较麻烦,经过一番思索和借助强大的github,发现go语言解析yaml了一个libyaml c库,但是网上的例子都比较麻烦,而且比较繁琐,就想法作了一个相对比较容易配置的解析应用,可以简单地类似viper 的模式进行配置实现不同的配置文件读取 。如你的配置文件很复杂请按格式修改KeyValue 全局变量,欢迎大家一起完善
库请自行下载 GitHub - yaml/libyaml: Canonical source repository for LibYAML
直接上代码
yaml示例文件
%YAML 1.1
---
mqtt:
subtopic: "Control/#"
pubtopic: "bbt"
qos: 1
serveraddress: "tcp://192.168.0.25:1883"
clientid: "kvm_test"
writelog: false
writetodisk: false
outputfile: "./receivedMessages.txt"
hearttime: 30
#ifndef __CONFIG_H__
#define __CONFIG_H__
#ifdef __cplusplus
extern "C" {
#endif
/************************/
/* Minimum YAML version */
/************************/
#define YAML_VERSION_MAJOR 1
#define YAML_VERSION_MINOR 1
#define STRUCT_TYPE_NAME 100
#define INT_TYPE_NAME 101
#define STRING_TYPE_NAME 102
#define BOOL_TYPE_NAME 103
#define FLOAT_TYPE_NAME 104
#define MAP_TYPE_NAME 105
#define LIST_TYPE_NAME 106
typedef struct{
char *key;
void *value;
int valuetype;
char *parent;
}KeyValue,*pKeyValue;
#ifdef __cplusplus
}
#endif
#endif
#include
#include
#include
#include
#include
#include
#include
#include "config.h"
typedef struct {
char *SUBTOPIC; //string `yaml:"subtopic" mapstructure:"subtopic"` //"topic1"
char *PUBTOPIC; //string `yaml:"pubtopic" mapstructure:"pubtopic"`
int QOS; //byte `yaml:"qos" mapstructure:"qos"` //1
char *SERVERADDRESS; //string `yaml:"serveraddress" mapstructure:"serveraddress"` //= "tcp://mosquitto:1883"
char *CLIENTID; //string `yaml:"clientid" mapstructure:"clientid"` //= "mqtt_subscriber"
int HEARTTIME; //int `yaml:"hearttime" mapstructure:"hearttime"`
// CommandLocalPath string `yam:"commanlocalpath"`
}mqttSection,*pmqttSection;
typedef struct {
mqttSection Mqtt;// `yaml:"mqtt" mapstructure:"mqtt"`
// KVM kvmSection `yaml:"kvm" mapstructure:"kvm"`
}ConfigT;
ConfigT config;
static KeyValue webrtcconfig[]={
{"mqtt",config,STRUCT_TYPE_NAME,NULL},
{"subtopic",(config.Mqtt.SUBTOPIC),STRING_TYPE_NAME,"mqtt"},
{"pubtopic",(config.Mqtt.PUBTOPIC),STRING_TYPE_NAME,"mqtt"},
{"qos",(config.Mqtt.QOS),INT_TYPE_NAME,"mqtt"},
{"serveraddress",(config.Mqtt.SERVERADDRESS),STRING_TYPE_NAME,"mqtt"},
{"clientid",(config.Mqtt.CLIENTID),STRING_TYPE_NAME,"mqtt"},
{"hearttime",(config.Mqtt.HEARTTIME),INT_TYPE_NAME,"mqtt"},
{NULL,NULL,0,NULL},
};
int printConfig(ConfigT * pconfig){
if(pconfig==NULL) return -1;
printf("mqtt:r ");
if(pconfig-Mqtt.SUBTOPIC!=NULL) {printf("subtopic: %sr ",pconfig-Mqtt.SUBTOPIC); }
if(pconfig-Mqtt.SUBTOPIC!=NULL) {printf("pubtopic: %sr ",pconfig-Mqtt.PUBTOPIC); }
printf("qos: %dr ",config.Mqtt.QOS);
if(pconfig-Mqtt.SERVERADDRESS!=NULL) {printf("serveraddress: %sr ",pconfig-Mqtt.SERVERADDRESS); }
if(pconfig-Mqtt.CLIENTID!=NULL) {printf("clientid: %sr ",pconfig-Mqtt.CLIENTID); }
printf("hearttime: %dr ",config.Mqtt.HEARTTIME);
}
int freeConfig(ConfigT * pconfig){
if(pconfig==NULL) return -1;
if(pconfig-Mqtt.SERVERADDRESS!=NULL) {free(pconfig-Mqtt.SERVERADDRESS); }
if(pconfig-Mqtt.CLIENTID!=NULL) {free(pconfig-Mqtt.CLIENTID); }
if(pconfig-Mqtt.SUBTOPIC!=NULL) {free(pconfig-Mqtt.SUBTOPIC); }
}
char currentkey[100];
void getvalue(yaml_event_t event,pKeyValue *ppconfigs){
char *value = https://www.04ip.com/post/(char *)event.data.scalar.value;
pKeyValue pconfig=*ppconfigs;
char *pstringname;
while(pconfig-key!=NULL){
if(currentkey[0]!=0){
if(!strcmp(currentkey,pconfig-key))
{
switch(pconfig-valuetype){
case STRING_TYPE_NAME:
pstringname=strdup(value);
printf("get string value %sr ",pstringname);
*((char**)pconfig-value)=pstringname;
memset(currentkey, 0, sizeof(currentkey));
break;
case INT_TYPE_NAME:
*((int*)(pconfig-value))=atoi(value);
memset(currentkey, 0, sizeof(currentkey));
break;
case BOOL_TYPE_NAME:
if(!strcmp(value,"true")) *((bool*)(pconfig-value))=true;
else *((bool*)(pconfig-value))=false;
memset(currentkey, 0, sizeof(currentkey));
break;
case FLOAT_TYPE_NAME:
*((float*)(pconfig-value))=atof(value);
memset(currentkey, 0, sizeof(currentkey));
break;
case STRUCT_TYPE_NAME:
case MAP_TYPE_NAME:
case LIST_TYPE_NAME:
memset(currentkey, 0, sizeof(currentkey));
strncpy(currentkey,value,strlen(value));
break;
default:
break;
}
break;
}
//continue;
}else{
if(!strcmp(value,pconfig-key)){
strncpy(currentkey,pconfig-key,strlen(pconfig-key));
break;
}
}
pconfig;
}
}
int Load_YAML_Config( char *yaml_file, KeyValue *(configs[]) )
{
struct stat filecheck;
yaml_parser_t parser;
yaml_event_t event;
bool done = 0;
unsigned char type = 0;
unsigned char sub_type = 0;
if (stat(yaml_file, filecheck) != false )
{
printf("[%s, line %d] Cannot open configuration file '%s'! %s", __FILE__, __LINE__, yaml_file, strerror(errno) );
return -1;
}
FILE *fh = fopen(yaml_file, "r");
if (!yaml_parser_initialize(parser))
{
printf("[%s, line %d] Failed to initialize the libyaml parser. Abort!", __FILE__, __LINE__);
return -1;
}
if (fh == NULL)
{
printf("[%s, line %d] Failed to open the configuration file '%s' Abort!", __FILE__, __LINE__, yaml_file);
return -1;
}
memset(currentkey, 0, sizeof(currentkey));
/* Set input file */
yaml_parser_set_input_file(parser, fh);
while(!done)
{
if (!yaml_parser_parse(parser, event))
{
/* Useful YAML vars: parser.context_mark.line 1, parser.context_mark.column 1, parser.problem, parser.problem_mark.line 1, parser.problem_mark.column 1 */
printf( "[%s, line %d] libyam parse error at line %ld in '%s'", __FILE__, __LINE__, parser.problem_mark.line 1, yaml_file);
}
if ( event.type == YAML_DOCUMENT_START_EVENT )
{
//yaml file first line is version
//%YAML 1.1
//---
yaml_version_directive_t *ver = event.data.document_start.version_directive;
if ( ver == NULL )
{
printf( "[%s, line %d] Invalid configuration file. Configuration must start with "%%YAML 1.1"", __FILE__, __LINE__);
}
int major = ver-major;
int minor = ver-minor;
if (! (major == YAML_VERSION_MAJORminor == YAML_VERSION_MINOR) )
{
printf( "[%s, line %d] Configuration has a invalid YAML version. Must be 1.1 or above", __FILE__, __LINE__);
return -1;
}
}
else if ( event.type == YAML_STREAM_END_EVENT )
{
done = true;
}
else if ( event.type == YAML_MAPPING_END_EVENT )
{
sub_type = 0;
}
else if ( event.type == YAML_SCALAR_EVENT )
{
getvalue(event,configs);
}
}
return 0;
}
int main(int argc, char *argv[]){
pKeyValue pconfig=webrtcconfig[0];
Load_YAML_Config("../../etc/kvmagent.yml",pconfig);
printConfig(config);
freeConfig(config);
【go语言解析yaml go语言解析excel】 }
go语言解析yaml的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于go语言解析excel、go语言解析yaml的信息别忘了在本站进行查找喔 。
推荐阅读
- 2017年html5发展,html5现在发展如何
- 虚拟主机通信软件,虚拟主机的三种方式
- 做直播怎么用手机玩电脑,手机直播如何用电脑
- 梯形函数源代码c语言 c语言 梯形图
- 怎么用u盘播放指定音乐,u盘音乐播放顺序设置
- 造船的单机游戏,造船的手机游戏
- 疯疯直播技巧,主播疯疯叫什么名字
- linux扫描pv命令 linux扫描仪
- oracle查询用户对象权限,oracle回收当前用户的对象权限