Конвертирование Map в Struct и обратно

This commit is contained in:
B4D_US3R 2025-05-04 19:31:33 +05:00
parent 12e96926e2
commit b6866f8540
5 changed files with 118 additions and 1 deletions

2
.gitignore vendored
View file

@ -26,3 +26,5 @@ go.work.sum
.env .env
testconfig.json testconfig.json
go.sum
main

9
miku/go.mod Normal file
View file

@ -0,0 +1,9 @@
module main
go 1.24.2
replace miku/users => ../users/
require miku/users v0.0.0-00010101000000-000000000000
require github.com/google/uuid v1.6.0 // indirect

28
miku/main.go Normal file
View file

@ -0,0 +1,28 @@
package main
import (
"encoding/json"
"fmt"
"log"
"miku/users"
"os"
)
func main() {
var confFile map[string]interface{}
file, err := os.ReadFile("../testconfig.json")
if err != nil {
fmt.Println(err)
}
err = json.Unmarshal(file, &confFile)
if err != nil {
fmt.Println(err)
}
vlessUsers := users.MapToStruct(confFile)
newUsers := vlessUsers.Add("test")
newConfFile, err := users.StructToConfig(newUsers, confFile)
if err != nil {
log.Println(err)
}
log.Println(newConfFile)
}

5
users/go.mod Normal file
View file

@ -0,0 +1,5 @@
module users
go 1.24.2
require github.com/google/uuid v1.6.0

73
users/users.go Normal file
View file

@ -0,0 +1,73 @@
package users
import (
"encoding/json"
"log"
"github.com/google/uuid"
)
type VLESSUsers []struct {
Name string `json:"name"`
UUID uuid.UUID `json:"uuid"`
}
func (u VLESSUsers) Del(user string) VLESSUsers {
var newU VLESSUsers
for _, v := range u {
if v.Name != user {
newU = append(newU, v)
}
}
return newU
}
func (u VLESSUsers) Add(user string) VLESSUsers {
var userStruct struct {
Name string
UUID uuid.UUID
}
userStruct.Name = user
randUUID, err := uuid.NewUUID()
if err != nil {
log.Println(err)
}
userStruct.UUID = randUUID
newU := append(u, struct {
Name string "json:\"name\""
UUID uuid.UUID "json:\"uuid\""
}(userStruct))
return newU
}
func MapToStruct(toStructMap map[string]interface{}) VLESSUsers {
var vlessUsers VLESSUsers
usedMap := toStructMap["inbounds"].([]interface{})[0].(map[string]interface{})["users"].([]interface{})
for _, curretMap := range usedMap {
userMap := curretMap.(map[string]interface{})
vlessUsers = append(vlessUsers, struct {
Name string "json:\"name\""
UUID uuid.UUID "json:\"uuid\""
}{
Name: userMap["name"].(string),
UUID: uuid.MustParse(userMap["uuid"].(string)),
})
}
return vlessUsers
}
func StructToConfig(vlessUsers VLESSUsers, configMap map[string]interface{}) (map[string]interface{}, error) {
var toInterface []map[string]interface{}
newConfigMap := configMap
structJson, err := json.Marshal(vlessUsers)
if err != nil {
return map[string]interface{}{}, err
}
err = json.Unmarshal(structJson, &toInterface)
if err != nil {
return map[string]interface{}{}, err
}
newConfigMap["inbounds"].([]interface{})[0].(map[string]interface{})["users"] = toInterface
return newConfigMap, nil
}