Добавлено: несколько аргументов функции и замыкание

This commit is contained in:
Archer Fox
2025-03-17 23:51:02 +03:00
parent e6340bd24f
commit dd4aca086d
2 changed files with 31 additions and 28 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
go-demo/app-1 go-demo/app-1
go-demo-4/data.json go-demo-4/data.json
go-demo-4/.env

View File

@@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"os"
"password/account" "password/account"
"password/files" "password/files"
"password/output" "password/output"
@@ -17,42 +18,43 @@ var menu = map[string]func(*account.VaultWithDb){
"4": deleteAccount, "4": deleteAccount,
} }
var menuVariants = []string{
"1. Создать аккаунт",
"2. Найти аккаунт по URL",
"3. Найти аккаунт по логину",
"4. Удалить аккаунт",
"5. Выход",
"Выберите вариант",
}
func menuCounter() func() {
i := 0
return func() {
i++
fmt.Println("Вызов:", i)
}
}
func main() { func main() {
// fmt.Println(output.Sum(100, 42))
// fmt.Println(output.Sum(10.7, 3.14))
// fmt.Println(output.Sum("Hello ", "world!"))
color.Blue("__Менеджер паролей__") color.Blue("__Менеджер паролей__")
res := os.Getenv("PWD")
fmt.Println(res)
vault := account.NewVault(files.NewJsonDb("data.json")) vault := account.NewVault(files.NewJsonDb("data.json"))
counter := menuCounter()
Menu: Menu:
for { for {
variant := PromptData([]string{ counter()
"1. Создать аккаунт", variant := PromptData(menuVariants...)
"2. Найти аккаунт по URL",
"3. Найти аккаунт по логину",
"4. Удалить аккаунт",
"5. Выход",
"Выберите вариант",
})
menuFunc := menu[variant] menuFunc := menu[variant]
if menuFunc == nil { if menuFunc == nil {
break Menu break Menu
} }
menuFunc(vault) menuFunc(vault)
// switch variant {
// case "1":
// createAccount(vault)
// case "2":
// findAccount(vault)
// case "3":
// deleteAccount(vault)
// default:
// break Menu
// }
} }
} }
func findAccountByUrl(vault *account.VaultWithDb) { func findAccountByUrl(vault *account.VaultWithDb) {
url := PromptData([]string{"Введите URL для поиска"}) url := PromptData("Введите URL для поиска")
// Анонимная функция как параметр // Анонимная функция как параметр
accounts := vault.FindAccounts(url, func(acc account.Account, str string) bool { accounts := vault.FindAccounts(url, func(acc account.Account, str string) bool {
return strings.Contains(acc.Url, str) return strings.Contains(acc.Url, str)
@@ -61,7 +63,7 @@ func findAccountByUrl(vault *account.VaultWithDb) {
} }
func findAccountByLogin(vault *account.VaultWithDb) { func findAccountByLogin(vault *account.VaultWithDb) {
login := PromptData([]string{"Введите Login для поиска"}) login := PromptData("Введите Login для поиска")
// Анонимная функция как параметр // Анонимная функция как параметр
accounts := vault.FindAccounts(login, func(acc account.Account, str string) bool { accounts := vault.FindAccounts(login, func(acc account.Account, str string) bool {
return strings.Contains(acc.Login, str) return strings.Contains(acc.Login, str)
@@ -79,7 +81,7 @@ func outputResults(accounts *[]account.Account) {
} }
func deleteAccount(vault *account.VaultWithDb) { func deleteAccount(vault *account.VaultWithDb) {
url := PromptData([]string{"Введите URL для поиска: "}) url := PromptData("Введите URL для поиска: ")
isDeleted := vault.DeleteAccountByUrl(url) isDeleted := vault.DeleteAccountByUrl(url)
if isDeleted { if isDeleted {
color.Green("Удалено") color.Green("Удалено")
@@ -89,9 +91,9 @@ func deleteAccount(vault *account.VaultWithDb) {
} }
func createAccount(vault *account.VaultWithDb) { func createAccount(vault *account.VaultWithDb) {
login := PromptData([]string{"Введите логин: "}) login := PromptData("Введите логин: ")
password := PromptData([]string{"Введите пароль: "}) password := PromptData("Введите пароль: ")
url := PromptData([]string{"Введите URL: "}) url := PromptData("Введите URL: ")
myAccount, err := account.NewAccount(login, password, url) myAccount, err := account.NewAccount(login, password, url)
if err != nil { if err != nil {
@@ -102,7 +104,7 @@ func createAccount(vault *account.VaultWithDb) {
} }
// функция введения данных // функция введения данных
func PromptData[T any](prompt []T) string { func PromptData(prompt ...string) string {
for i, line := range prompt { for i, line := range prompt {
if i == len(prompt)-1 { if i == len(prompt)-1 {
fmt.Printf("%v: ", line) fmt.Printf("%v: ", line)