前言
我们的程序肯定避免不了对文件读取和写入,包括在程序启动时对配置文件的读取,在项目运行时可能会对某些文件有写入操作,这些都是必不可少的操作,今天我们就来学习学习文件的读取
原生读取
这里我们分两步,一个是打开文件,获取文件信息,另一个是直接读取文件内容
文件打开
// 打开文件
file, err := os.Open("/Users/dongshirong/Desktop/text/text.txt")
if err != nil {
panic("文件打开失败")
}
fmt.Println(file.Name())
file.Close()
直接读取文件内容
// 读取文件内容
content, err := os.ReadFile("/Users/dongshirong/Desktop/text/text.txt")
if err != nil {
panic("读取失败")
}
fmt.Println(string(content))
读取配置文件
读取配置文件才是我们程序最需要的东西,配置文件一般是.properties和.yml
1、viper
支持多种配置文件格式,包括 JSON,TOML,YAML,HECL,envfile,甚至还包括Java properties,也支持默认设置
首先,我在桌面的创建了文件夹text,并添加了文件application.yml,如下图
然后使用go读取文件
import (
"fmt"
"github.com/spf13/viper"
)
func main() {
// 直接设置读取文件
//viper.SetConfigFile("/Users/dongshirong/Desktop/text/application.yml")
// 设置读取文件名及读取路径、扩展名
viper.SetConfigName("application")
viper.AddConfigPath("/Users/dongshirong/Desktop/text/")
viper.SetConfigType("yml")
err := viper.ReadInConfig()
if err != nil {
panic("读取配置信息失败")
}
keys := viper.AllKeys()
fmt.Println(keys)
fmt.Println(viper.ConfigFileUsed())
fmt.Print(viper.Get("test"))
var cfg config
viper.Unmarshal(&cfg)
fmt.Println(cfg)
}
type config struct {
Server server
Application application
test string
}
type server struct {
Port string
Name string
}
type application struct {
Mysql string
}
- 如果只设置了文件名和文件路径,则会按照以下扩展名找到第一个进行读取json、toml、yaml、yml、properties、props
- 两种方式必须任选其一,否则根本不知道在哪里读取
2、使用configor
结构体与文件和1中一致,只需要稍微修改代码即可
import (
"fmt"
"github.com/jinzhu/configor"
)
func main() {
var Config config
err := configor.New(&configor.Config{
//Debug: true,
//ErrorOnUnmatchedKeys: true,
//AutoReload: true,
//AutoReloadInterval: time.Second,
//AutoReloadCallback: func(config interface{}) {
//config变化后触发
//},
}).Load(&Config, "/Users/dongshirong/Desktop/text/application.yml")
if err != nil {
panic(err)
}
fmt.Print(Config)
}
- 这里可以配置热加载AutoReload和AutoReloadInterval
- 这里的解析也支持yml,json,ymal,toml
这样我们就可以很简单的从配置文件中获取我们想要的东西,也可以加在不同的配置文件进行读取了