Go语言 将文本文件放入切片中然后比较

jm81lzqq  于 2023-03-21  发布在  Go
关注(0)|答案(1)|浏览(164)

我正在写一个程序,在这个程序中,我将用户名逐行地放入一个.txt文件中,并验证用户名是否在其中,然后创建一个切片,将文件转换为字符串,并将其附加到字符串切片中,现在我尝试使用for循环遍历切片,找到文件中的用户名,并将其与另一个包含用户名的字符串变量进行比较。我想检查一下它是否在切片中。最好的方法是什么?我试着用切片的for循环比较范围内的元素和我想检查的用户名的变量,但是不起作用。换句话说,我想找出最好的方法来获取一个txt文件,该文件包含一个从上到下添加的用户名列表,让我的程序读取(循环),并将其与具有文本文件中内容的字符串变量中的预定项(用户名)进行比较,并确定其是否匹配。
用户名(字符串变量)==用户名(在文本文件中)

  • 同样username变量将基于程序用户输入的内容,所以我尝试最终检查当用户输入他们的用户名时程序是否会验证它是否在文件中,谢谢。

我尝试过的代码示例:

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)是我试图读取的文本文件;input是用户将为他们的用户名输入的字符串变量,该用户名是在程序中较早预定的。

jckbn6z7

jckbn6z71#

作为一名Go语言程序员,我很快就把你的全部应用需求转化成了一个Go语言程序,然后把它和你的代码进行了比较,我不明白为什么你要对Go语言切片进行线性搜索,为什么不对Go语言Map进行随机访问呢?
在比较用户名是否相等之前,请删除白色(strings.TrimSpace),并将其转换为小写(strings.ToLower)以区分大小写。
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 {
            user = strings.ToLower(user)
            users[user] = true
        }
    }
    if err := scnr.Err(); err != nil {
        return nil, err
    }
    return users, nil
}

func loadUsersFile(name string) (map[string]bool, error) {
    f, err := os.Open(name)
    if err != nil {
        return nil, err
    }
    defer f.Close()
    users, err := loadUsers(f)
    if err != nil {
        return nil, err
    }
    return users, nil
}

func isUser(users map[string]bool, user string) bool {
    user = strings.TrimSpace(user)
    user = strings.ToLower(user)
    return users[user]
}

func main() {
    users, err := loadUsersFile("users.txt")
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }

    scnr := bufio.NewScanner(os.Stdin)
    for scnr.Scan() {
        user := scnr.Text()
        fmt.Print("User: ", user)
        if isUser(users, 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
username3
User: username3 found
$

相关问题