欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語言讀取配置文件,go 讀取配置文件

如何用Go語言打造一個高性能MySQL Proxy

讀取配置文件并啟動,在配置文件中設(shè)置的監(jiān)聽端口監(jiān)聽客戶端請求。

站在用戶的角度思考問題,與客戶深入溝通,找到豐縣網(wǎng)站設(shè)計與豐縣網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站制作、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋豐縣地區(qū)。

收到客戶端連接請求后,啟動一個goroutine單獨處理該請求。

首選進(jìn)行登錄驗證,驗證過程完全兼容MySQL認(rèn)證協(xié)議,由于用戶名和密碼在配置文件中已經(jīng)設(shè)置好,所以可以利用該信息驗證連接請求是否合法。

當(dāng)用戶名和密碼都正確時,轉(zhuǎn)入下面的步驟,否則返回出錯信息給客戶端。

認(rèn)證通過后,客戶端發(fā)送SQL語句。

kingshard對客戶端發(fā)送過來的SQL語句,進(jìn)行詞法和語義分析,識別出SQL的類型和生成SQL的路由計劃。如果有必要還會改寫SQL,然后轉(zhuǎn)發(fā)到相應(yīng)的DB。也有可能不做詞法和語義分析直接轉(zhuǎn)發(fā)到相應(yīng)的后端DB。如果轉(zhuǎn)發(fā)SQL是分表且跨多個DB,則每個DB對應(yīng)啟動一個goroutine發(fā)送SQL和接收該DB返回的結(jié)果。

接收并合并結(jié)果,然后轉(zhuǎn)發(fā)給客戶端。

Go語言-一個簡單的MockServer實現(xiàn)

用于在開發(fā)階段,服務(wù)端接口沒有正式完成之前,模擬接口請求,便于客戶端測試。

建立一個文件夾(Config),放置所有的接口文件

將接口按如下json格式存儲到成文件,一個接口對應(yīng)一個文件

如登錄接口:./Config/login.json

定義接口

讀取所有的接口配置文件

C語言操作yaml配置文件通用操作工具

在go語言中使用viper之類的庫很方便的處理yaml配置文件,但是在c語言中就比較麻煩,經(jīng)過一番思索和借助強(qiáng)大的github,發(fā)現(xiàn)了一個libyaml c庫,但是網(wǎng)上的例子都比較麻煩,而且比較繁瑣,就想法作了一個相對比較容易配置的解析應(yīng)用,可以簡單地類似viper 的模式進(jìn)行配置實現(xiàn)不同的配置文件讀取。如你的配置文件很復(fù)雜請按格式修改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 = (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_MAJOR minor == 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 怎么寫入conf配置文件

為了快速聲明配置文件中的全局變量而寫的封裝包,大家笑納,廢話少說,直接上方法。

1.首先,下載包:

1

2

go get "github.com/luckykris/go-utilbox/Env"

go get "github.com/luckykris/go-utilbox/Conf/ReadConf"

2.書寫配置文件(例):

vim test.cfg,寫入如下配置內(nèi)容:

1

2

3

4

5

6

7

8

[gms]

port = 2016

[db]

db = mysql

user = root

password = redhat

port = 3306

host = 127.0.0.1

3.寫一個test.go來獲取配置文件里的配置,并且將所有配置文件內(nèi)的信息聲明全局變量,注意,你需要在go代碼里提前定義各項配置的數(shù)據(jù)類型(string,int目前只支持兩類)以及默認(rèn)值。如下列g(shù)o代碼:

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

package main

import(

"github.com/luckykris/go-utilbox/Env"

"github.com/luckykris/go-utilbox/Conf/ReadConf"

"fmt"

)

func main(){

Init()

}

func Init(){

//定義gms配置區(qū)域

gms:=ReadConf.CONFIG{

AREA:"gms",//區(qū)域名

CONF:map[string]ReadConf.CONFIGROW{

"port":{TYPE:"int",EXIT:false,DEFAULT:1},//具體配置,

//此條為port配置默認(rèn)值為1

//類型為int

//注意:如果標(biāo)明類型是int默認(rèn)值

//不要加雙引號“”不然會被認(rèn)為 //是字符串.

//false的意思是,當(dāng)配置文件里讀 //取不到這個配置的時候程序退出

},

}

//定義db配置區(qū)域

db:=ReadConf.CONFIG{

AREA:"db",//區(qū)域名

CONF:map[string]ReadConf.CONFIGROW{

"port":{TYPE:"int",EXIT:false,DEFAULT:3306},

"db":{TYPE:"string",EXIT:false,DEFAULT:"mongo"},

"user":{TYPE:"string",EXIT:false,DEFAULT:"root"},

"password":{TYPE:"string",EXIT:false,DEFAULT:"root"},

"host":{TYPE:"string",EXIT:false,DEFAULT:"localhost"},

},

}

//讓程序讀取配合文件,并且把需要提取的配置區(qū)域變量傳入LodConf函數(shù)

//這個函數(shù)執(zhí)行之后,所有實現(xiàn)定義的配置就都生成全局變量了。

ReadConf.LoadConf("test.cfg",gms,db)

//以下是對配置文件的全局變量的調(diào)用方式,用Env.ENV["配置區(qū)域/配置條目"].(類型)

//因為返回的值是interface{}類型的,所以需要自己轉(zhuǎn)換下類型。

fmt.Printf("gms/port:%d\n",Env.ENV["gms/port"].(int))

fmt.Printf("db/port:%d\n",Env.ENV["db/port"].(int))

fmt.Printf("db/db:%s\n",Env.ENV["db/db"].(string))

fmt.Printf("db/user:%s\n",Env.ENV["db/user"].(string))

fmt.Printf("db/password:%s\n",Env.ENV["db/password"].(string))

fmt.Printf("db/host:%s\n",Env.ENV["db/host"].(string))

}

4.以下就是執(zhí)行此GO程序后的輸出結(jié)果啦:

1

2

3

4

5

6

7

[root@gbz.test.org GoMonitorServer]# go run test.go

gms/port:2016

db/port:3306

db/db:mysql

db/user:root

db/password:redhat

db/host:127.0.0.1

Go 各種方式加載配置文件

go run 或者 go build后在配置目錄的相對路徑上執(zhí)行

假設(shè)當(dāng)前目錄如下:

├─config

│ │ main.go

│ │

│ └─file // 配置文件目錄

│ config.ini

也就是說無論你是go run或者build后的執(zhí)行程序,都應(yīng)該在你執(zhí)行目錄下

有該配置文件路徑如file/config.ini

否則就會發(fā)生以下錯誤, 無法讀取配置文件

panic: Error:can not read file "./file/config.ini"

使用絕對路徑讀取配置文件

如果配置文件動態(tài)的話, 具體怎么傳入 配置文件路徑

go-bindata 把配置文件打包進(jìn)去

5.1 使用遠(yuǎn)程配置中心去讀取配置

標(biāo)題名稱:go語言讀取配置文件,go 讀取配置文件
網(wǎng)站地址:http://chinadenli.net/article29/dsspgch.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器網(wǎng)站收錄商城網(wǎng)站域名注冊軟件開發(fā)品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)