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

用户名(字符串变量)==用户名(在文本文件中)

*USERNAME变量也将基于程序用户输入的内容.因此,我正在try 最终判断当用户输入他们的用户名时,程序是否会验证它是否在文件中.谢谢.

我try 过的代码示例:

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
    }
}

注意:字符串(文件)是我试图读取的文本文件;INPUT是用户将在程序中预先确定的用户名输入的字符串变量.

推荐答案

作为一名围棋程序员,我很快将你的整体应用程序需求转化为围棋程序.然后我将其与您的代码进行了比较.我不明白你为什么要对围棋切片进行线性搜索.为什么不使用随机访问围棋 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
$ 

Go相关问答推荐

使用Gorm创建自定义连接表

如何在另一个文件夹中使用Delve运行二进制文件?

转到http服务器头内容-类型设置为多部分/表单-数据,但在客户端获取内容-类型:文本/纯文本

如何在链接中写入链接

如何从 nil 指针创建值

如何在 Chi Router 的受保护路由下提供静态文件(尤其是图像)?

Kafka golang 生产者在错误后更改分区计数

如何从 Go Lambda 函数返回 HTML?

将 firestoreinteger_value转换为整数

当填充通道的函数调用未嵌入 goroutine 时,为什么我会遇到死锁?

Go 中如何调用测试函数?

使用 os/exec 和在命令行执行之间的结果莫名其妙地不同

为什么 reflect.TypeOf(new(Encoder)).Elem() != reflect.TypeOf(interfaceVariable)?

如何在gin中获取参数值数组

Golang - 无法从 pipped Windows 命令中获取结果

golang jwt.MapClaims 获取用户ID

使用正则表达式拆分具有相同标题的数据块

如何在gorm中处理多个查询

不能使用 *T 类型的变量作为参数类型

Go 语言的select语句