feat(Go-Tool):添加FileUtil.go、FileReadTool.go单测类代码,修改相应bug-----IniTool.go依赖获取不到,注释掉代码、创建ArrayUtil.go,添加数组对应方法

This commit is contained in:
huangzj
2020-04-30 18:08:29 +08:00
parent 9549597abc
commit 62266cd26b
16 changed files with 660 additions and 153 deletions
+12 -1
View File
@@ -2,4 +2,15 @@ module Go-Tool
go 1.13 go 1.13
require github.com/go-ini/ini v1.55.0 // indirect require (
github.com/Bowery/prompt v0.0.0-20190916142128-fa8279994f75 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dchest/safefile v0.0.0-20151022103144-855e8d98f185 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/kardianos/govendor v1.0.9 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/stretchr/testify v1.5.1 // indirect
golang.org/x/sys v0.0.0-20200428200454-593003d681fa // indirect
golang.org/x/tools v0.0.0-20200429213335-127c98bd7927 // indirect
gopkg.in/yaml.v2 v2.2.8 // indirect
)
+47 -2
View File
@@ -1,2 +1,47 @@
github.com/go-ini/ini v1.55.0 h1:0wVcG9udk2C3TGgmdIGKK9ScOZHZB5nbG+gwji9fhhc= github.com/Bowery/prompt v0.0.0-20190916142128-fa8279994f75 h1:xGHheKK44eC6K0u5X+DZW/fRaR1LnDdqPHMZMWx5fv8=
github.com/go-ini/ini v1.55.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/Bowery/prompt v0.0.0-20190916142128-fa8279994f75/go.mod h1:4/6eNcqZ09BZ9wLK3tZOjBA1nDj+B0728nlX5YRlSmQ=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dchest/safefile v0.0.0-20151022103144-855e8d98f185 h1:3T8ZyTDp5QxTx3NU48JVb2u+75xc040fofcBaN+6jPA=
github.com/dchest/safefile v0.0.0-20151022103144-855e8d98f185/go.mod h1:cFRxtTwTOJkz2x3rQUNCYKWC93yP1VKjR8NUhqFxZNU=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/kardianos/govendor v1.0.9 h1:WOH3FcVI9eOgnIZYg96iwUwrL4eOVx+aQ66oyX2R8Yc=
github.com/kardianos/govendor v1.0.9/go.mod h1:yvmR6q9ZZ7nSF5Wvh40v0wfP+3TwwL8zYQp+itoZSVM=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200428200454-593003d681fa h1:yMbJOvnfYkO1dSAviTu/ZguZWLBTXx4xE3LYrxUCCiA=
golang.org/x/sys v0.0.0-20200428200454-593003d681fa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200429213335-127c98bd7927 h1:qunaQbmBN1l/xZt8mr6MLr8G/IOFiMbXvxYbGVqKlyw=
golang.org/x/tools v0.0.0-20200429213335-127c98bd7927/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+3
View File
@@ -12,3 +12,6 @@
2020/4/28 : 创建IniTool.go:包装int工具类,进行文件配置数据结构的读取,包括对应的使用例子(工具地址:https://ini.unknwon.cn/docs/howto/work_with_sections) 2020/4/28 : 创建IniTool.go:包装int工具类,进行文件配置数据结构的读取,包括对应的使用例子(工具地址:https://ini.unknwon.cn/docs/howto/work_with_sections)
2020/4/30 :添加FileUtil.go、FileReadTool.go单测类代码,修改相应bug-----IniTool.go依赖获取不到,注释掉代码
2020/4/30 : 创建ArrayUtil.go,添加数组对应方法
+57
View File
@@ -0,0 +1,57 @@
/*
* @Author : huangzj
* @Time : 2020/4/30 16:06
* @Description:数组工具类测试
*/
package array
import (
"fmt"
"testing"
)
type MM struct {
a int
b string
n NN
}
type NN struct {
a int
b float64
}
func TestArray(t *testing.T) {
n := NN{
a: 12,
b: 2.22,
}
n1 := NN{
a: 12,
b: 2.22,
}
n2 := NN{
a: 12,
b: 2.212,
}
x := MM{
a: 1,
b: "1",
n: n,
}
y := MM{
a: 1,
b: "1",
n: n1,
}
z := MM{
a: 1,
b: "1",
n: n2,
}
fmt.Print(x == y)
fmt.Print("\n\n测试一下")
fmt.Print(x == z)
}
+10
View File
@@ -0,0 +1,10 @@
12321321
3213
3213213
321321
321321
3
32132131
321321321
View File
View File
+21
View File
@@ -0,0 +1,21 @@
/*
* @Author : huangzj
* @Time : 2020/4/30 14:55
* @Description 文件读取工具测试
*/
package file
import (
"Go-Tool/util/file"
"fmt"
"testing"
)
func TestReadFileLineNum(t *testing.T) {
fmt.Print(file.ReadFileLineNum("F:\\Go个人代码\\src\\Go-Tool\\test\\emptyDirTest\\1\\11.txt"))
}
func TestReadFileLineNumExceptEmptyLine(t *testing.T) {
fmt.Println(file.ReadFileLineNumExceptEmptyLine("F:\\Go个人代码\\src\\Go-Tool\\test\\emptyDirTest\\1\\11.txt"))
}
+53
View File
@@ -0,0 +1,53 @@
/*
* @Author : huangzj
* @Time : 2020/4/30 14:56
* @Description 文件工具测试
*/
package file
import (
"Go-Tool/util/file"
"fmt"
"testing"
)
var (
filePaths = [5]string{"F:\\Go个人代码\\src\\Go-Tool\\test\\emptyDirTest\\1\\11.txt",
"F:\\Go个人代码\\src\\Go-Tool\\test\\emptyDirTest\\2\\1\\11.txt",
"F:\\Go个人代码\\src\\Go-Tool\\test\\emptyDirTest\\2\\2222\\4\\4\\111.txt",
"F:\\Go个人代码\\src\\Go-Tool\\test\\emptyDirTest\\2\\2222\\4\\4\\4\\4\\1211.txt",
"F:\\Go个人代码\\src\\Go-Tool\\test\\emptyDirTest\\3\\11.txt"}
)
func TestGetAllFileNameFromDir(t *testing.T) {
s := file.GetAllFileNameFromDir("F:\\Go个人代码\\src\\Go-Tool\\test\\emptyDirTest")
for _, row := range s {
fmt.Print(row)
}
}
func TestGetAllEmptyDir(t *testing.T) {
_, s := file.GetAllEmptyDir("F:\\Go个人代码\\src\\Go-Tool\\test\\emptyDirTest")
for _, row := range s {
fmt.Print(fmt.Sprint(row, "\n\n"))
}
}
func TestGetAllDir(t *testing.T) {
_, s := file.GetAllDir("F:\\Go个人代码\\src\\Go-Tool\\test\\emptyDirTest")
for _, row := range s {
fmt.Print(row)
}
}
func TestGetAllNotEmptyDir(t *testing.T) {
_, s := file.GetAllNotEmptyDir("F:\\Go个人代码\\src\\Go-Tool\\test\\emptyDirTest")
for _, row := range s {
fmt.Print(row)
}
}
+7
View File
@@ -0,0 +1,7 @@
/*
* @Author : huangzj
* @Time : 2020/4/30 14:56
* @Description 文件写入工具测试
*/
package file
+131
View File
@@ -0,0 +1,131 @@
/*
* @Author : huangzj
* @Time : 2020/4/30 15:53
* @Description: 数组工具
* 这边测试了一下,go的结构体或者是非结构体类型,通过==比较的话,会校验到对应的每一个属性的值。
* 也就是说就算两个结构体的指针地址不一样,但是他的所有属性值都是一样的话,==返回的结果也是true
* 这边直接在入口的地方进行了map、slice、interface、Func、chan、ptr、UnsafePointer 类型的拦截
* 但是如果结构体中包含不能比较的类型,应该也是会报错
*/
package array
import "reflect"
var (
invalid = [7]reflect.Kind{reflect.UnsafePointer, reflect.Map, reflect.Slice,
reflect.Interface, reflect.Func, reflect.Chan, reflect.Ptr}
)
/*
* 返回数组中是否包含对应元素的结果
*/
func Contains(list []interface{}, ele interface{}) bool {
if typeInvalid(reflect.TypeOf(ele).Kind()) {
panic("该类型不支持比较")
}
for _, row := range list {
if row == ele {
return true
}
}
return false
}
/*
* 返回数组中是否不包含对应元素的结果
*/
func NotContains(list []interface{}, ele interface{}) bool {
return !Contains(list, ele)
}
/*
* 返回两个数组的所有元素是否相等的结果
*/
func IsSameList(list, eList []interface{}) bool {
same := 0
if len(list) != len(eList) {
return false
}
for _, l := range list {
for _, r := range eList {
if l == r {
same++
break
}
}
}
return same == len(list)
}
/*
* @param fList 传父集合
* @param sList 传子集合
* @return sList是不是fList的子集
*/
func IsSubSet(fList, sList []interface{}) bool {
if len(fList) < len(sList) {
return false
}
for _, r := range sList {
if NotContains(fList, r) {
return false
}
}
return true
}
/*
* 获取两个集合的交集
*/
func Intersection(list, otherList []interface{}) []interface{} {
result := make([]interface{}, 0)
for _, row := range list {
if Contains(otherList, row) {
result = append(result, row)
}
}
return result
}
/*
* 返回前一个数组包含,后一个数组不包含的结果(不是数量大的数组-数量小的数组)
*/
func DiffSet(cList, nList []interface{}) []interface{} {
result := make([]interface{}, 0)
for _, row := range cList {
if NotContains(nList, row) {
result = append(result, row)
}
}
return result
}
/*
* 返回两个数组的并集,不包含重复的数据
*/
func Union(aList, bList []interface{}) []interface{} {
result := make([]interface{}, 0)
for _, row := range aList {
if NotContains(result, row) {
result = append(result, row)
}
}
for _, row := range bList {
if NotContains(bList, row) {
result = append(result, row)
}
}
return result
}
func typeInvalid(k reflect.Kind) bool {
for _, row := range invalid {
if k == row {
return true
}
}
return false
}
+44
View File
@@ -66,3 +66,47 @@ func ReadByCircle(filePath string) (string, *err2.FileError) {
return fs, nil return fs, nil
} }
func ReadFileLineNum(filePath string) (int, *err2.FileError) {
file, err := os.Open(filePath)
if err != nil {
return 0, err2.ENewFileError(err)
}
defer file.Close()
num := 0
inputReader := bufio.NewReader(file)
for {
_, readerError := inputReader.ReadString('\n')
if readerError == io.EOF {
num++
break
}
num++
}
return num, nil
}
func ReadFileLineNumExceptEmptyLine(filePath string) (int, *err2.FileError) {
file, err := os.Open(filePath)
if err != nil {
return 0, err2.ENewFileError(err)
}
defer file.Close()
num := 0
inputReader := bufio.NewReader(file)
for {
input, readerError := inputReader.ReadString('\n')
if readerError == io.EOF {
if input != "\r\n" && input != "" {
num++
}
break
}
if input != "\r\n" && input != "" {
num++
}
}
return num, nil
}
+155 -31
View File
@@ -172,30 +172,8 @@ func GetAllFileFromDir(filePath string) []*os.File {
return getFiles(filePath) return getFiles(filePath)
} }
/* func GetAllFileNameFromDir(filePath string) []string {
* @param return getFileNames(filePath)
* @return
* @description 删除文件夹下面所有的空文件夹
*/
func DeleteEmptyDir(filePath string) *err2.FileError {
err, is, _ := IsDirExist(filePath)
if err != nil {
return err2.ENewFileError(err)
}
if !is {
return err2.NewFileError("非文件夹")
}
//拿到所有的空文件夹
emptyDirList := getEmptyDir(filePath)
for _, row := range emptyDirList {
err := os.RemoveAll(row)
if err != nil {
return err2.ENewFileError(err)
}
}
return nil
} }
/* /*
@@ -211,25 +189,141 @@ func GetAllEmptyDir(dir string) (*err2.FileError, []string) {
if !is { if !is {
return err2.NewFileError("非文件夹"), nil return err2.NewFileError("非文件夹"), nil
} }
return nil, getEmptyDir(dir)
list := make([]string, 0)
errE, paths := GetAllDir(dir)
if errE != nil {
return errE, nil
}
for _, row := range paths {
err, is := isEmptyDir(row)
if err != nil {
return err, nil
}
if is {
list = append(list, row)
}
}
return nil, list
} }
func getEmptyDir(dir string) []string { /*
emptyDirList := make([]string, 0) * 获取所有非空文件夹的路径集合
*/
func GetAllNotEmptyDir(dir string) (*err2.FileError, []string) {
err, is, _ := IsDirExist(dir)
if err != nil {
return err2.ENewFileError(err), nil
}
if !is {
return err2.NewFileError("非文件夹"), nil
}
files := make([]string, 0)
err1, aFiles := GetAllDir(dir)
if err1 != nil {
return err1, nil
}
err3, eFiles := GetAllEmptyDir(dir)
if err3 != nil {
return err3, nil
}
for _, a := range aFiles {
isIn := false
for _, e := range eFiles {
if a == e {
isIn = true
break
}
}
if !isIn {
files = append(files, a)
}
}
return nil, files
}
/*
* 获取目录下的所有文件夹路径集合
*/
func GetAllDir(dir string) (*err2.FileError, []string) {
err, is, _ := IsDirExist(dir)
if err != nil {
return err2.ENewFileError(err), nil
}
if !is {
return err2.NewFileError("非文件夹"), nil
}
return nil, getAllDir(dir)
}
/*
* @param
* @return
* @description 删除文件夹下面所有的空文件夹
*/
func DeleteEmptyDir(filePath string) *err2.FileError {
err, is, _ := IsDirExist(filePath)
if err != nil {
return err2.ENewFileError(err)
}
if !is {
return err2.NewFileError("非文件夹")
}
//拿到所有的空文件夹
err, emptyDirList := GetAllEmptyDir(filePath)
if err != nil {
return err
}
for _, row := range emptyDirList {
err := os.RemoveAll(row)
if err != nil {
return err2.ENewFileError(err)
}
}
return nil
}
func getAllDir(dir string) []string {
dirList := make([]string, 0)
info, err := ioutil.ReadDir(dir) info, err := ioutil.ReadDir(dir)
if err != nil { if err != nil {
return nil return nil
} }
for _, f := range info { for _, f := range info {
if f.IsDir() { if f.IsDir() {
list := getFiles(fmt.Sprint(dir, "\\", f.Name())) list := getAllDir(fmt.Sprint(dir, "\\", f.Name()))
if list == nil || len(list) == 0 { dirList = append(dirList, fmt.Sprint(dir, "\\", f.Name()))
emptyDirList = append(emptyDirList, dir) if list != nil {
for _, l := range list {
dirList = append(dirList, l)
}
} }
} }
} }
return emptyDirList return dirList
}
func isEmptyDir(dir string) (*err2.FileError, bool) {
_, err := ioutil.ReadDir(dir)
if err != nil {
panic(err)
}
file := GetAllFileFromDir(dir)
for _, f := range file {
info, err := f.Stat()
if err != nil {
return err2.ENewFileError(err), false
}
if !info.IsDir() {
return nil, false
}
}
return nil, true
} }
func getFiles(filePath string) []*os.File { func getFiles(filePath string) []*os.File {
@@ -240,6 +334,7 @@ func getFiles(filePath string) []*os.File {
} }
for _, f := range info { for _, f := range info {
//处理文件夹的部分
if f.IsDir() { if f.IsDir() {
list := getFiles(fmt.Sprint(filePath, "\\", f.Name())) list := getFiles(fmt.Sprint(filePath, "\\", f.Name()))
if list != nil { if list != nil {
@@ -247,8 +342,37 @@ func getFiles(filePath string) []*os.File {
fileList = append(fileList, row) fileList = append(fileList, row)
} }
} }
} else {
//处理文件的部分 -- 使用读写方法打开文件
thisFile, _ := os.OpenFile(fmt.Sprint(filePath, "\\", f.Name()), os.O_RDWR, 0666)
fileList = append(fileList, thisFile)
} }
} }
return fileList return fileList
} }
func getFileNames(filePath string) []string {
nameList := make([]string, 0)
info, err := ioutil.ReadDir(filePath)
if err != nil {
return nil
}
for _, f := range info {
//处理文件夹的部分
if f.IsDir() {
list := getFileNames(fmt.Sprint(filePath, "\\", f.Name()))
if list != nil {
for _, row := range list {
nameList = append(nameList, row)
}
}
} else {
//处理文件的部分
nameList = append(nameList, fmt.Sprint(filePath, "\\", f.Name()))
}
}
return nameList
}
+120 -119
View File
@@ -6,122 +6,123 @@
package ini package ini
import ( //
"gopkg.in/ini.v1" //import (
"time" // "go-ini/ini"
) // "time"
//)
func NewIniFileObj(iniPath string) (*ini.File, error) { //
return ini.Load(iniPath) //func NewIniFileObj(iniPath string) (*ini.File, error) {
} // return ini.Load(iniPath)
//}
/* //
* @param f ini文件对象 ///*
* @return name->Section 的Map // * @param f ini文件对象
* @description 通过所有Section对应的name->Section的map // * @return name->Section 的Map
*/ // * @description 通过所有Section对应的name->Section的map
func GetSectionMap(f *ini.File) map[string]*ini.Section { // */
sectionMap := make(map[string]*ini.Section, 0) //func GetSectionMap(f *ini.File) map[string]*ini.Section {
sections := f.Sections() // sectionMap := make(map[string]*ini.Section, 0)
for _, row := range sections { // sections := f.Sections()
sectionMap[row.Name()] = row // for _, row := range sections {
} // sectionMap[row.Name()] = row
// }
return sectionMap //
} // return sectionMap
//}
/* //
* @param f ini文件对象 ///*
* @param sectionName 区间名字 // * @param f ini文件对象
* @return key->value的map // * @param sectionName 区间名字
* @description 返回对应Section名字的key-value的map结构,如果没有这个section返回空map // * @return key->value的map
*/ // * @description 返回对应Section名字的key-value的map结构,如果没有这个section返回空map
func GetKeyValueBySection(f *ini.File, sectionName string) map[string]string { // */
keyValueMap := make(map[string]string, 0) //func GetKeyValueBySection(f *ini.File, sectionName string) map[string]string {
sec := f.Section(sectionName) // keyValueMap := make(map[string]string, 0)
for _, row := range sec.Keys() { // sec := f.Section(sectionName)
keyValueMap[row.Name()] = row.Value() // for _, row := range sec.Keys() {
} // keyValueMap[row.Name()] = row.Value()
// }
return keyValueMap //
} // return keyValueMap
//}
/* //
* @param f ini文件对象 ///*
* @return {section -> [{key->value}]} // * @param f ini文件对象
* @description 返回每个区间对应的所有keyvalue的结构,具体返回结构如下: // * @return {section -> [{key->value}]}
* { // * @description 返回每个区间对应的所有key、value的结构,具体返回结构如下:
* "sectionName1":[ // * {
"keyName1":KeyValue1 // * "sectionName1":[
* ..... // "keyName1":KeyValue1
* ], // * .....
* ..... // * ],
* } // * .....
*/ // * }
func GetKeyValueByALLSection(f *ini.File) { //*/
secMap := make(map[string][]map[string]string, 0) //func GetKeyValueByALLSection(f *ini.File) {
for _, row := range f.Sections() { // secMap := make(map[string][]map[string]string, 0)
keyList := make([]map[string]string, 0) // for _, row := range f.Sections() {
for _, r := range row.Keys() { // keyList := make([]map[string]string, 0)
keyMap := make(map[string]string, 0) // for _, r := range row.Keys() {
keyMap[r.Name()] = r.Value() // keyMap := make(map[string]string, 0)
keyList = append(keyList, keyMap) // keyMap[r.Name()] = r.Value()
} // keyList = append(keyList, keyMap)
// }
secMap[row.Name()] = keyList //
} // secMap[row.Name()] = keyList
} // }
//}
/* //
* 使用例子,官网说明文档可以看到,这边补记录一下. ///*
*/ // * 使用例子,官网说明文档可以看到,这边补记录一下.
func example(cfg *ini.File) { // */
//获取键值时设定候选值,如果没有找到,则返回默认值 //func example(cfg *ini.File) {
cfg.Section("SectionName").Key("KeyName").In("default", []string{"str", "arr", "types"}) // //获取键值时设定候选值,如果没有找到,则返回默认值
cfg.Section("SectionName").Key("KeyName").InFloat64(1.1, []float64{1.25, 2.5, 3.75}) // cfg.Section("SectionName").Key("KeyName").In("default", []string{"str", "arr", "types"})
cfg.Section("SectionName").Key("KeyName").InInt(5, []int{10, 20, 30}) // cfg.Section("SectionName").Key("KeyName").InFloat64(1.1, []float64{1.25, 2.5, 3.75})
cfg.Section("SectionName").Key("KeyName").InInt64(10, []int64{10, 20, 30}) // cfg.Section("SectionName").Key("KeyName").InInt(5, []int{10, 20, 30})
cfg.Section("SectionName").Key("KeyName").InUint(4, []uint{3, 6, 9}) // cfg.Section("SectionName").Key("KeyName").InInt64(10, []int64{10, 20, 30})
cfg.Section("SectionName").Key("KeyName").InUint64(8, []uint64{3, 6, 9}) // cfg.Section("SectionName").Key("KeyName").InUint(4, []uint{3, 6, 9})
//这边的三个时间不一样,为了防止报错这么写... // cfg.Section("SectionName").Key("KeyName").InUint64(8, []uint64{3, 6, 9})
cfg.Section("SectionName").Key("KeyName").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time.Now(), time.Now(), time.Now()}) // //这边的三个时间不一样,为了防止报错这么写...
cfg.Section("SectionName").Key("KeyName").InTime(time.Now(), []time.Time{time.Now(), time.Now(), time.Now()}) // RFC3339 // cfg.Section("SectionName").Key("KeyName").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time.Now(), time.Now(), time.Now()})
// cfg.Section("SectionName").Key("KeyName").InTime(time.Now(), []time.Time{time.Now(), time.Now(), time.Now()}) // RFC3339
//验证获取的值是否在指定范围内,第一个参数是默认值,后面两个值分别是范围 //
cfg.Section("SectionName").Key("KeyName").RangeFloat64(0.0, 1.1, 2.2) // //验证获取的值是否在指定范围内,第一个参数是默认值,后面两个值分别是范围
cfg.Section("SectionName").Key("KeyName").RangeInt(0, 10, 20) // cfg.Section("SectionName").Key("KeyName").RangeFloat64(0.0, 1.1, 2.2)
cfg.Section("SectionName").Key("KeyName").RangeInt64(0, 10, 20) // cfg.Section("SectionName").Key("KeyName").RangeInt(0, 10, 20)
cfg.Section("SectionName").Key("KeyName").RangeTimeFormat(time.RFC3339, time.Now(), time.Now(), time.Now()) // cfg.Section("SectionName").Key("KeyName").RangeInt64(0, 10, 20)
cfg.Section("SectionName").Key("KeyName").RangeTime(time.Now(), time.Now(), time.Now()) // RFC3339 // cfg.Section("SectionName").Key("KeyName").RangeTimeFormat(time.RFC3339, time.Now(), time.Now(), time.Now())
// cfg.Section("SectionName").Key("KeyName").RangeTime(time.Now(), time.Now(), time.Now()) // RFC3339
//自动分割键值到切片,当存在无效输入时,使用零值代替 //
// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] // //自动分割键值到切片,当存在无效输入时,使用零值代替
// Input: how, 2.2, are, you -> [0.0 2.2 0.0 0.0] // // Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4]
cfg.Section("SectionName").Key("KeyName").Strings(",") // // Input: how, 2.2, are, you -> [0.0 2.2 0.0 0.0]
cfg.Section("SectionName").Key("KeyName").Float64s(",") // cfg.Section("SectionName").Key("KeyName").Strings(",")
cfg.Section("SectionName").Key("KeyName").Ints(",") // cfg.Section("SectionName").Key("KeyName").Float64s(",")
cfg.Section("SectionName").Key("KeyName").Int64s(",") // cfg.Section("SectionName").Key("KeyName").Ints(",")
cfg.Section("SectionName").Key("KeyName").Uints(",") // cfg.Section("SectionName").Key("KeyName").Int64s(",")
cfg.Section("SectionName").Key("KeyName").Uint64s(",") // cfg.Section("SectionName").Key("KeyName").Uints(",")
cfg.Section("SectionName").Key("KeyName").Times(",") // cfg.Section("SectionName").Key("KeyName").Uint64s(",")
// cfg.Section("SectionName").Key("KeyName").Times(",")
//自动分割键值到切片,从结果切片中剔除无效输入 //
// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] // //自动分割键值到切片,从结果切片中剔除无效输入
// Input: how, 2.2, are, you -> [2.2] // // Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4]
cfg.Section("SectionName").Key("KeyName").ValidFloat64s(",") // // Input: how, 2.2, are, you -> [2.2]
cfg.Section("SectionName").Key("KeyName").ValidInts(",") // cfg.Section("SectionName").Key("KeyName").ValidFloat64s(",")
cfg.Section("SectionName").Key("KeyName").ValidInt64s(",") // cfg.Section("SectionName").Key("KeyName").ValidInts(",")
cfg.Section("SectionName").Key("KeyName").ValidUints(",") // cfg.Section("SectionName").Key("KeyName").ValidInt64s(",")
cfg.Section("SectionName").Key("KeyName").ValidUint64s(",") // cfg.Section("SectionName").Key("KeyName").ValidUints(",")
cfg.Section("SectionName").Key("KeyName").ValidTimes(",") // cfg.Section("SectionName").Key("KeyName").ValidUint64s(",")
// cfg.Section("SectionName").Key("KeyName").ValidTimes(",")
//自动分割键值到切片,当存在无效输入时,直接返回错误 //
// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] // //自动分割键值到切片,当存在无效输入时,直接返回错误
// Input: how, 2.2, are, you -> error // // Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4]
cfg.Section("SectionName").Key("KeyName").StrictFloat64s(",") // // Input: how, 2.2, are, you -> error
cfg.Section("SectionName").Key("KeyName").StrictInts(",") // cfg.Section("SectionName").Key("KeyName").StrictFloat64s(",")
cfg.Section("SectionName").Key("KeyName").StrictInt64s(",") // cfg.Section("SectionName").Key("KeyName").StrictInts(",")
cfg.Section("SectionName").Key("KeyName").StrictUints(",") // cfg.Section("SectionName").Key("KeyName").StrictInt64s(",")
cfg.Section("SectionName").Key("KeyName").StrictUint64s(",") // cfg.Section("SectionName").Key("KeyName").StrictUints(",")
cfg.Section("SectionName").Key("KeyName").StrictTimes(",") // cfg.Section("SectionName").Key("KeyName").StrictUint64s(",")
} // cfg.Section("SectionName").Key("KeyName").StrictTimes(",")
//}