我正在编写一个程序,我在 .txt 文件中逐行获取用户名并验证用户名在其中。然后我创建了一个切片并将文件转换为字符串并将其附加到字符串切片。我现在尝试使用 for 循环遍历切片以查找文件中的用户名并将其与包含用户名的另一个字符串变量进行比较。我想检查它是否在切片中。做这个的最好方式是什么?我已经尝试使用切片的 for 循环与具有我要检查的用户名的变量来比较范围内的元素,但它不起作用。所以换句话说,我想找出最好的方法来获取一个包含从上到下添加的用户名列表的 txt 文件,让我的程序从该文本文件中读取(循环),并将其与字符串变量中的预定项(用户名)与文本文件中的内容,并确定它是否匹配。
用户名(字符串变量)== 用户名(在文本文件中)
*此外,用户名变量将基于程序用户输入的内容。所以我试图最终检查当用户输入他们的用户名时,程序是否会验证它是否在文件中。谢谢。
我试过的代码示例:
var readSystemCtl []string
readSystemCtl = append(readSystemCtl, string(file))
for _, username := range of readSystemCtl {
if username == input {
//Continue program if true
break
}else {
//Do something else
}
}
注意:string(file) 是我要读取的文本文件;和输入,是用户将为其用户名输入的字符串变量,该用户名是在程序中预先确定的。
作为一名Go程序员,我很快将你的整体应用需求转化成了一个Go程序。然后我将它与您的代码进行了比较。我不明白你为什么使用 Go 切片的线性搜索。为什么不使用随机访问 Go 地图。
users.go
package main
import (
"bufio"
"fmt"
"io"
"os"
"strings"
)
func loadUsers(r io.Reader) (map[string]bool, error) {
users := make(map[string]bool)
scnr := bufio.NewScanner(r)
for scnr.Scan() {
user := strings.TrimSpace(scnr.Text())
if len(user) > 0 {
users[strings.ToLower(user)] = true
}
}
if err := scnr.Err(); err != nil {
return nil, err
}
return users, nil
}
func main() {
f, err := os.Open("users.txt")
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
defer f.Close()
users, err := loadUsers(f)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
scnr := bufio.NewScanner(os.Stdin)
for scnr.Scan() {
user := strings.TrimSpace(scnr.Text())
fmt.Print("User: ", user)
if users[strings.ToLower(user)] {
fmt.Println(" found")
} else {
fmt.Println(" not found")
}
}
if err := scnr.Err(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
$ cat users.txt
username1
username2
username3
$ go build users.go
$ ./users
user name X
User: user name X not found
UserName2
User: UserName2 found
$