zoukankan      html  css  js  c++  java
  • 配置文件读写

    • 使用ini为后缀的配置文件

    • 使用第三方库为

      go get gopkg.in/gcfg.v1
      
    • 代码样例

      package main
      
      import(
      	"os"
      	"fmt"
      	"log"
      	"time"
      	"gopkg.in/gcfg.v1"
      )
      var path string = "conf.ini"
      var config *Config
      
      // 获取配置文件相对应的信息
      type Config struct{
      	User map[string]*struct{
      		UID string
      		Pid string
      	}
      }
      
      
      func init(){
      	log.SetFlags(log.Lshortfile|log.Ltime)
      	config = &Config{}
      }
      
      // 读取
      func readConfig()(err error){
      	if path==""{
      		err =  fmt.Errorf("path is null")
      		log.Println(err)
      		return
      	}
      	log.Println("读取配置文件")
      	err = gcfg.ReadFileInto(config,path)
      	if err!=nil{
      		err = fmt.Errorf("Failed to parse config file:%s",err)
      		log.Println(err)
      		return
      	}
      	return
      }
      
      func prinfConfigInfo()(err error){
      	defer func(){
      		if r:=recover();r!=nil{
      			err = r.(error)
      		}
      	}()
      	log.Println("每个10秒打印配置文件")
      	ticker := time.NewTicker(10*time.Second)
      	for{
      		select {
      		case <-ticker.C:
      			for key,value := range config.User{
      				log.Printf("%v uid=%v pid=%v 
      ",key,key,value)
      			}
      		}
      	}
      }
      func main(){
      	fmt.Println("读取配置文件信息")
      	err := readConfig()
      	if err!=nil{
      		log.Println(err)
      		return
      	}
      	fmt.Println("打印配置信息")
      	err = prinfConfigInfo()
      	if err!=nil{
      		log.Println(err)
      	}
      }
      
    • 配置文件内容(conf.ini)

      [user "A"]
      uid = 45
      pid = 54
      
      [user "B"]
      uid = 12
      pid = 12
      

    思考:在整个项目中,要是需要修改到配置文件,是否需要在手动停止项目,修改之后,在手动开启项目呢?

    • 手动的原因:内存中已经存有修改前的配置文件信息,要是单单修改配置文件,是不会把新的配置文件信息,存到内存中的。因此。。。。
    • 也可以不用,只要对配置文件进行热更新就行

    样例代码

    package main
    
    import(
    	"os"
    	"fmt"
    	"log"
    	"time"
    	"sync/atomic"
    	"gopkg.in/gcfg.v1"
    )
    var path string = "conf.ini"
    var lastModTime = time.Now().Unix() // 获取目前的时间
    var config *Config
    
    // 获取配置文件相对应的信息
    type Config struct{
    	User map[string]*struct{
    		UID string
    		Pid string
    	}
    }
    
    
    func init(){
    	log.SetFlags(log.Lshortfile|log.Ltime)
    	config = &Config{}
    }
    
    // 读取
    func readConfig()(err error){
    	if path==""{
    		err =  fmt.Errorf("path is null")
    		log.Println(err)
    		return
    	}
    	log.Println("读取配置文件")
    	err = gcfg.ReadFileInto(config,path)
    	if err!=nil{
    		err = fmt.Errorf("Failed to parse config file:%s",err)
    		log.Println(err)
    		return
    	}
    	return
    }
    
    func prinfConfigInfo()(err error){
    	defer func(){
    		if r:=recover();r!=nil{
    			err = r.(error)
    		}
    	}()
    	log.Println("每个10秒打印配置文件")
    	ticker := time.NewTicker(10*time.Second)
    	for{
    		select {
    		case <-ticker.C:
    			for key,value := range config.User{
    				log.Printf("%v uid=%v pid=%v 
    ",key,key,value)
    			}
    		}
    	}
    }
    func monitor(){
    	log.Println("设置监听时间")
    	ticker := time.NewTicker(10*time.Second)
    	log.Println("启动监听器")
    	for{
    		select{
    			case <-ticker.C:
    				// 使用匿名函数是关闭文件
    				func(){
    					if path==""{
    						err :=  fmt.Errorf("path is null")
    						log.Println(err)
    						return
    					}
    					fmt.Println("打开配置文件")
    					file,err := os.Open("conf.ini")
    					if err!=nil{
    						err = fmt.Errorf("打开配置文件错误:%v",err)
    						log.Println(err)
    						return
    					}
    					defer file.Close()
    					fmt.Println("获取配置信息")
    					fileInfo,err := file.Stat()
    					if err!=nil{
    						err = fmt.Errorf("获取配置文件信息错误:%v",err)
    						log.Println(err)
    						return
    					}
    					modtime := fileInfo.ModTime()
    					if modtime.Unix()>lastModTime{
    						log.Println("配置文件已经修改啦,通知各个部门")
    						lastModTime = modtime.Unix()
    						err:= readConfig()
    						if err!=nil{
    							err = fmt.Errorf("重新读取配置文件错误:%v",err)
    							log.Println(err)
    							return
    						}
    					}else{
    						return
    					}
    				}()					
    		}
    	}
    }
    
    func main(){
    	fmt.Println("读取配置文件信息")
    	log.Println("监听文件是否修改")
    	go monitor()
    	err := readConfig()
    	if err!=nil{
    		log.Println(err)
    		return
    	}
    	fmt.Println("打印配置信息")
    	err = prinfConfigInfo()
    	if err!=nil{
    		log.Println(err)
    	}
    }
    

    总结

    • time.Ticker适合用来制作监听器
  • 相关阅读:
    Nginx中工作进程(work-process)为多少合适?
    Ubuntu中安装启动Nginx
    怎么获得类加载器?
    XML解析方式有哪些?
    HashMap常见面试题
    IO流分类
    集合之间的区别
    css布局2
    css布局1
    css3 总结01
  • 原文地址:https://www.cnblogs.com/MyUniverse/p/11748243.html
Copyright © 2011-2022 走看看