深入解析Go语言os/user包:用户和组管理实战指南

news2024/9/24 23:30:05

深入解析Go语言os/user包:用户和组管理实战指南

    • 引言
      • 什么是`os/user`包?
      • 为什么要学习`os/user`包?
      • 本文将介绍的内容
    • `os/user`包基础
      • 如何导入`os/user`包
      • 获取当前用户信息
        • 示例代码
      • `*user.User`类型详解
      • 常见错误处理
      • 小结
    • 用户查询与管理
      • 根据用户名查询用户
        • 示例代码
      • 根据用户ID查询用户
        • 示例代码
      • 根据组名查询组
        • 示例代码
      • 根据组ID查询组
        • 示例代码
      • 小结
    • 用户组信息获取
      • 获取用户所属组
        • 示例代码
      • 获取组成员
        • 示例代码
      • 获取用户所属的组名称
        • 示例代码
      • 小结
    • 实战案例
      • 案例一:用户信息查询工具
        • 工具功能
        • 代码实现
      • 案例二:用户权限检查工具
        • 工具功能
        • 代码实现
      • 案例三:用户和组管理工具
        • 工具功能
        • 代码实现
      • 小结
    • 总结与常见问题
      • `os/user`包的使用要点
      • 常见问题及解决方案
        • 1. 无法获取当前用户信息
        • 2. 无法根据用户名或用户ID查询用户
        • 3. 无法根据组名或组ID查询组
        • 4. 无法获取组成员

在这里插入图片描述

引言

在Go语言的开发过程中,处理用户和组的信息是一个常见的需求。无论是进行系统管理、权限控制,还是构建一些特定的工具,都可能需要获取当前用户的信息,查询用户和组,或者管理用户权限。Go语言标准库中的os/user包为这些需求提供了强有力的支持。

什么是os/user包?

os/user包是Go标准库中的一部分,专门用于获取操作系统用户和组相关的信息。这个包提供了许多实用的函数,能够帮助开发者方便地进行用户和组的查询与管理工作。通过使用os/user包,开发者可以:

  • 获取当前用户的信息
  • 根据用户名或用户ID查找用户
  • 获取用户所属的组
  • 根据组名或组ID查找组
  • 获取组成员的信息

为什么要学习os/user包?

在实际开发中,处理用户和组的信息是一个非常常见的需求。比如:

  • 系统管理工具:需要获取当前用户的信息、查找其他用户或者查询用户所属的组。
  • 权限控制:根据用户和组的信息来实现不同级别的权限控制。
  • 用户信息查询工具:构建一个工具,能够方便地查询操作系统中的用户和组信息。

通过学习并掌握os/user包的使用技巧,开发者可以在项目中更加高效地处理用户和组的信息,从而提高开发效率,增强系统的安全性和可维护性。

本文将介绍的内容

本文将详细介绍os/user包的使用方法和技巧,并通过具体的实战案例来展示如何在实际开发中应用这些技巧。主要内容包括:

  • os/user包的基础知识
  • 如何获取当前用户的信息
  • 如何根据用户名或用户ID查询用户
  • 如何获取用户所属的组信息
  • 如何根据组名或组ID查询组
  • 如何获取组成员的信息
  • 实战案例:构建用户信息查询工具、用户权限检查工具和用户组管理工具

通过学习本文,您将能够全面掌握os/user包的使用方法,并能够在实际项目中灵活应用这些技巧,解决各种与用户和组相关的问题。

在接下来的章节中,我们将逐步深入,详细讲解os/user包的各个功能及其具体用法。

os/user包基础

在开始使用os/user包之前,我们需要先了解如何导入该包以及如何使用其基本功能。这个章节将介绍os/user包的基础知识,包括如何导入包、获取当前用户信息等。

如何导入os/user

在Go语言中,导入一个包非常简单。我们只需要在代码的开头使用import语句导入所需的包即可。对于os/user包,我们可以这样导入:

import (
    "fmt"
    "os/user"
)

获取当前用户信息

获取当前用户的信息是os/user包最常用的功能之一。我们可以使用user.Current()函数来获取当前用户的信息。这个函数会返回一个*user.User类型的指针,包含了当前用户的详细信息。

示例代码

以下是一个简单的示例,展示了如何获取并打印当前用户的信息:

package main

import (
    "fmt"
    "log"
    "os/user"
)

func main() {
    currentUser, err := user.Current()
    if err != nil {
        log.Fatalf("无法获取当前用户信息: %v", err)
    }

    fmt.Println("当前用户信息:")
    fmt.Printf("用户名: %s\n", currentUser.Username)
    fmt.Printf("用户ID: %s\n", currentUser.Uid)
    fmt.Printf("组ID: %s\n", currentUser.Gid)
    fmt.Printf("用户主目录: %s\n", currentUser.HomeDir)
    fmt.Printf("完整名称: %s\n", currentUser.Name)
}

在这个示例中,我们首先调用user.Current()获取当前用户的信息,如果获取失败,会打印错误信息并终止程序。然后,我们使用fmt.Printf函数打印出当前用户的用户名、用户ID、组ID、主目录和完整名称。

*user.User类型详解

在上述代码示例中,我们看到了*user.User类型。这个类型是一个结构体,包含了与用户相关的各种信息。以下是*user.User类型的定义:

type User struct {
    Uid      string // 用户ID
    Gid      string // 组ID
    Username string // 用户名
    Name     string // 完整名称
    HomeDir  string // 用户主目录
}

每个字段的含义如下:

  • Uid:用户ID,通常是一个字符串表示的数字。
  • Gid:组ID,表示用户所属的主组ID。
  • Username:用户名。
  • Name:用户的完整名称。
  • HomeDir:用户的主目录路径。

常见错误处理

在使用os/user包时,常见的错误主要是由于权限不足或者系统不支持某些操作导致的。我们可以通过检查返回的错误信息来进行相应的处理。

例如,在获取当前用户信息时,如果出现错误,我们可以使用log.Fatalf函数打印错误并终止程序:

currentUser, err := user.Current()
if err != nil {
    log.Fatalf("无法获取当前用户信息: %v", err)
}

通过这种方式,我们可以确保程序在获取用户信息时出现问题时能够及时提示并停止运行,避免进一步的错误。

小结

在这一章节中,我们介绍了如何导入os/user包以及如何使用user.Current()函数获取当前用户的信息。我们还详细解析了*user.User类型,并展示了一个简单的示例代码来打印当前用户的信息。接下来,我们将深入探讨如何根据用户名或用户ID查询用户信息。

用户查询与管理

在实际开发中,我们常常需要根据用户名或用户ID查询用户信息。os/user包提供了非常方便的函数来实现这一功能。在本章节中,我们将介绍如何使用LookupLookupId函数查询用户,以及如何使用LookupGroupLookupGroupId函数查询组。

根据用户名查询用户

我们可以使用user.Lookup(username string)函数来根据用户名查询用户信息。该函数返回一个*user.User类型的指针,包含查询到的用户信息。

示例代码

以下是一个示例,展示了如何根据用户名查询用户信息:

package main

import (
    "fmt"
    "log"
    "os/user"
)

func main() {
    username := "your-username" // 替换为要查询的用户名
    queriedUser, err := user.Lookup(username)
    if err != nil {
        log.Fatalf("无法根据用户名查询用户: %v", err)
    }

    fmt.Println("查询到的用户信息:")
    fmt.Printf("用户名: %s\n", queriedUser.Username)
    fmt.Printf("用户ID: %s\n", queriedUser.Uid)
    fmt.Printf("组ID: %s\n", queriedUser.Gid)
    fmt.Printf("用户主目录: %s\n", queriedUser.HomeDir)
    fmt.Printf("完整名称: %s\n", queriedUser.Name)
}

在这个示例中,我们调用user.Lookup(username)函数,并传入要查询的用户名。如果查询成功,会打印出该用户的详细信息;如果查询失败,则打印错误信息并终止程序。

根据用户ID查询用户

除了根据用户名查询用户外,我们还可以根据用户ID查询用户信息。我们可以使用user.LookupId(uid string)函数来实现这一功能。

示例代码

以下是一个示例,展示了如何根据用户ID查询用户信息:

package main

import (
    "fmt"
    "log"
    "os/user"
)

func main() {
    userID := "1000" // 替换为要查询的用户ID
    queriedUser, err := user.LookupId(userID)
    if err != nil {
        log.Fatalf("无法根据用户ID查询用户: %v", err)
    }

    fmt.Println("查询到的用户信息:")
    fmt.Printf("用户名: %s\n", queriedUser.Username)
    fmt.Printf("用户ID: %s\n", queriedUser.Uid)
    fmt.Printf("组ID: %s\n", queriedUser.Gid)
    fmt.Printf("用户主目录: %s\n", queriedUser.HomeDir)
    fmt.Printf("完整名称: %s\n", queriedUser.Name)
}

在这个示例中,我们调用user.LookupId(uid)函数,并传入要查询的用户ID。如果查询成功,会打印出该用户的详细信息;如果查询失败,则打印错误信息并终止程序。

根据组名查询组

类似于用户查询,os/user包还提供了根据组名查询组信息的功能。我们可以使用user.LookupGroup(groupname string)函数来实现这一功能。

示例代码

以下是一个示例,展示了如何根据组名查询组信息:

package main

import (
    "fmt"
    "log"
    "os/user"
)

func main() {
    groupname := "your-groupname" // 替换为要查询的组名
    queriedGroup, err := user.LookupGroup(groupname)
    if err != nil {
        log.Fatalf("无法根据组名查询组: %v", err)
    }

    fmt.Println("查询到的组信息:")
    fmt.Printf("组名: %s\n", queriedGroup.Name)
    fmt.Printf("组ID: %s\n", queriedGroup.Gid)
}

在这个示例中,我们调用user.LookupGroup(groupname)函数,并传入要查询的组名。如果查询成功,会打印出该组的详细信息;如果查询失败,则打印错误信息并终止程序。

根据组ID查询组

我们还可以根据组ID查询组信息。我们可以使用user.LookupGroupId(gid string)函数来实现这一功能。

示例代码

以下是一个示例,展示了如何根据组ID查询组信息:

package main

import (
    "fmt"
    "log"
    "os/user"
)

func main() {
    groupID := "1000" // 替换为要查询的组ID
    queriedGroup, err := user.LookupGroupId(groupID)
    if err != nil {
        log.Fatalf("无法根据组ID查询组: %v", err)
    }

    fmt.Println("查询到的组信息:")
    fmt.Printf("组名: %s\n", queriedGroup.Name)
    fmt.Printf("组ID: %s\n", queriedGroup.Gid)
}

在这个示例中,我们调用user.LookupGroupId(gid)函数,并传入要查询的组ID。如果查询成功,会打印出该组的详细信息;如果查询失败,则打印错误信息并终止程序。

小结

在这一章节中,我们介绍了如何使用os/user包中的函数来查询用户和组的信息。具体包括根据用户名查询用户、根据用户ID查询用户、根据组名查询组以及根据组ID查询组的功能。通过这些函数,开发者可以方便地获取所需的用户和组信息,为系统管理和权限控制等任务提供支持。在下一章节中,我们将探讨如何获取用户所属的组信息及组成员信息。

用户组信息获取

在许多实际应用场景中,我们不仅需要查询用户和组的信息,还需要知道一个用户所属的所有组,以及一个组包含的所有用户。os/user包为此提供了一些非常实用的函数。在本章节中,我们将介绍如何使用这些函数来获取用户组信息。

获取用户所属组

我们可以使用user.GroupIds()函数来获取当前用户所属的所有组ID。这个函数返回一个字符串切片,包含了当前用户所属的所有组ID。

示例代码

以下是一个示例,展示了如何获取当前用户所属的所有组ID:

package main

import (
    "fmt"
    "log"
    "os/user"
)

func main() {
    currentUser, err := user.Current()
    if err != nil {
        log.Fatalf("无法获取当前用户信息: %v", err)
    }

    groupIDs, err := currentUser.GroupIds()
    if err != nil {
        log.Fatalf("无法获取当前用户所属组: %v", err)
    }

    fmt.Println("当前用户所属的组ID:")
    for _, groupID := range groupIDs {
        fmt.Println(groupID)
    }
}

在这个示例中,我们首先获取当前用户的信息,然后调用currentUser.GroupIds()函数获取该用户所属的所有组ID,并逐个打印出来。

获取组成员

在某些情况下,我们需要获取一个组中的所有成员。虽然os/user包本身并没有直接提供获取组成员的函数,但我们可以通过查询系统的/etc/group文件或使用其他系统工具来实现这一功能。

示例代码

以下是一个使用os/exec包来调用系统命令获取组成员的示例:

package main

import (
    "fmt"
    "log"
    "os/exec"
    "strings"
)

func main() {
    groupName := "your-groupname" // 替换为要查询的组名
    cmd := exec.Command("getent", "group", groupName)
    output, err := cmd.Output()
    if err != nil {
        log.Fatalf("无法获取组成员: %v", err)
    }

    outputStr := string(output)
    parts := strings.Split(outputStr, ":")
    if len(parts) < 4 {
        log.Fatalf("无法解析组信息: %s", outputStr)
    }

    members := strings.Split(parts[3], ",")
    fmt.Printf("组 %s 的成员:\n", groupName)
    for _, member := range members {
        fmt.Println(member)
    }
}

在这个示例中,我们使用exec.Command函数调用系统的getent命令来获取组成员信息,并解析输出结果获取组成员列表。

获取用户所属的组名称

有时候我们不仅需要获取用户所属的组ID,还需要获取这些组的名称。我们可以通过查询每个组ID对应的组名来实现这一功能。

示例代码

以下是一个示例,展示了如何获取当前用户所属组的名称:

package main

import (
    "fmt"
    "log"
    "os/user"
)

func main() {
    currentUser, err := user.Current()
    if err != nil {
        log.Fatalf("无法获取当前用户信息: %v", err)
    }

    groupIDs, err := currentUser.GroupIds()
    if err != nil {
        log.Fatalf("无法获取当前用户所属组: %v", err)
    }

    fmt.Println("当前用户所属的组:")
    for _, groupID := range groupIDs {
        group, err := user.LookupGroupId(groupID)
        if err != nil {
            log.Printf("无法根据组ID查询组: %v", err)
            continue
        }
        fmt.Printf("组名: %s, 组ID: %s\n", group.Name, group.Gid)
    }
}

在这个示例中,我们获取当前用户所属的所有组ID,然后逐个查询每个组ID对应的组名,并打印出来。

小结

在这一章节中,我们介绍了如何使用os/user包获取用户所属的组信息,以及如何获取组成员。通过这些方法,开发者可以更全面地管理和查询用户与组的关系。在下一章节中,我们将通过一些实战案例来展示如何在实际开发中应用这些技巧。

实战案例

在本章节中,我们将通过几个实战案例来展示如何在实际开发中应用os/user包的各种功能。这些案例包括实现一个用户信息查询工具、用户权限检查工具以及用户和组管理工具。

案例一:用户信息查询工具

我们将实现一个命令行工具,用于查询指定用户的信息。该工具可以根据用户名或用户ID查询用户详细信息,并打印到控制台。

工具功能
  • 根据用户名查询用户信息
  • 根据用户ID查询用户信息
  • 打印用户的详细信息,包括用户名、用户ID、组ID、主目录和完整名称
代码实现
package main

import (
    "flag"
    "fmt"
    "log"
    "os/user"
)

func main() {
    username := flag.String("username", "", "用户名")
    userID := flag.String("uid", "", "用户ID")
    flag.Parse()

    if *username == "" && *userID == "" {
        log.Fatalf("请提供用户名或用户ID")
    }

    var queriedUser *user.User
    var err error

    if *username != "" {
        queriedUser, err = user.Lookup(*username)
    } else {
        queriedUser, err = user.LookupId(*userID)
    }

    if err != nil {
        log.Fatalf("查询用户信息失败: %v", err)
    }

    fmt.Println("查询到的用户信息:")
    fmt.Printf("用户名: %s\n", queriedUser.Username)
    fmt.Printf("用户ID: %s\n", queriedUser.Uid)
    fmt.Printf("组ID: %s\n", queriedUser.Gid)
    fmt.Printf("用户主目录: %s\n", queriedUser.HomeDir)
    fmt.Printf("完整名称: %s\n", queriedUser.Name)
}

在这个工具中,我们使用flag包解析命令行参数,以获取用户名或用户ID。然后根据提供的参数调用user.Lookupuser.LookupId函数查询用户信息,并打印查询结果。

案例二:用户权限检查工具

我们将实现一个命令行工具,用于检查当前用户是否属于某个特定的组。该工具可以用来验证用户的权限。

工具功能
  • 获取当前用户信息
  • 获取当前用户所属的所有组
  • 检查当前用户是否属于指定组
代码实现
package main

import (
    "fmt"
    "log"
    "os/user"
)

func main() {
    groupName := "your-groupname" // 替换为要检查的组名

    currentUser, err := user.Current()
    if err != nil {
        log.Fatalf("无法获取当前用户信息: %v", err)
    }

    groupIDs, err := currentUser.GroupIds()
    if err != nil {
        log.Fatalf("无法获取当前用户所属组: %v", err)
    }

    belongsToGroup := false
    for _, groupID := range groupIDs {
        group, err := user.LookupGroupId(groupID)
        if err != nil {
            log.Printf("无法根据组ID查询组: %v", err)
            continue
        }
        if group.Name == groupName {
            belongsToGroup = true
            break
        }
    }

    if belongsToGroup {
        fmt.Printf("当前用户属于组 %s\n", groupName)
    } else {
        fmt.Printf("当前用户不属于组 %s\n", groupName)
    }
}

在这个工具中,我们获取当前用户的信息及其所属的组,然后遍历这些组以检查是否包含指定的组名。

案例三:用户和组管理工具

我们将实现一个命令行工具,用于管理用户和组信息。该工具可以查询用户的详细信息、查询组的详细信息,并显示组的成员。

工具功能
  • 根据用户名或用户ID查询用户信息
  • 根据组名或组ID查询组信息
  • 显示组的所有成员
代码实现
package main

import (
    "flag"
    "fmt"
    "log"
    "os/exec"
    "os/user"
    "strings"
)

func getGroupMembers(groupName string) ([]string, error) {
    cmd := exec.Command("getent", "group", groupName)
    output, err := cmd.Output()
    if err != nil {
        return nil, fmt.Errorf("无法获取组成员: %v", err)
    }

    outputStr := string(output)
    parts := strings.Split(outputStr, ":")
    if len(parts) < 4 {
        return nil, fmt.Errorf("无法解析组信息: %s", outputStr)
    }

    members := strings.Split(parts[3], ",")
    return members, nil
}

func main() {
    username := flag.String("username", "", "用户名")
    userID := flag.String("uid", "", "用户ID")
    groupName := flag.String("groupname", "", "组名")
    groupID := flag.String("gid", "", "组ID")
    flag.Parse()

    if *username != "" || *userID != "" {
        var queriedUser *user.User
        var err error

        if *username != "" {
            queriedUser, err = user.Lookup(*username)
        } else {
            queriedUser, err = user.LookupId(*userID)
        }

        if err != nil {
            log.Fatalf("查询用户信息失败: %v", err)
        }

        fmt.Println("查询到的用户信息:")
        fmt.Printf("用户名: %s\n", queriedUser.Username)
        fmt.Printf("用户ID: %s\n", queriedUser.Uid)
        fmt.Printf("组ID: %s\n", queriedUser.Gid)
        fmt.Printf("用户主目录: %s\n", queriedUser.HomeDir)
        fmt.Printf("完整名称: %s\n", queriedUser.Name)
    }

    if *groupName != "" || *groupID != "" {
        var queriedGroup *user.Group
        var err error

        if *groupName != "" {
            queriedGroup, err = user.LookupGroup(*groupName)
        } else {
            queriedGroup, err = user.LookupGroupId(*groupID)
        }

        if err != nil {
            log.Fatalf("查询组信息失败: %v", err)
        }

        fmt.Println("查询到的组信息:")
        fmt.Printf("组名: %s\n", queriedGroup.Name)
        fmt.Printf("组ID: %s\n", queriedGroup.Gid)

        members, err := getGroupMembers(queriedGroup.Name)
        if err != nil {
            log.Fatalf("获取组成员失败: %v", err)
        }

        fmt.Printf("组 %s 的成员:\n", queriedGroup.Name)
        for _, member := range members {
            fmt.Println(member)
        }
    }
}

在这个工具中,我们提供了多种命令行参数来查询用户和组信息,并显示组的所有成员。通过调用系统命令getent,我们获取并解析组成员信息。

小结

在这一章节中,我们通过三个实战案例展示了如何在实际开发中应用os/user包的各种功能。通过这些示例代码,您可以更好地理解如何使用os/user包查询和管理用户和组信息,并将这些技巧应用到自己的项目中。

总结与常见问题

在本文的最后,我们将总结os/user包的使用要点,并讨论一些常见问题及其解决方案。同时,我们还将推荐一些进一步学习资源,帮助您更深入地了解和应用os/user包。

os/user包的使用要点

通过本文的学习,我们已经掌握了os/user包的以下主要功能:

  1. 获取当前用户信息:使用user.Current()函数获取当前用户的详细信息,包括用户名、用户ID、组ID、主目录和完整名称。
  2. 查询用户信息:使用user.Lookup(username)user.LookupId(uid)函数,根据用户名或用户ID查询用户信息。
  3. 查询组信息:使用user.LookupGroup(groupname)user.LookupGroupId(gid)函数,根据组名或组ID查询组信息。
  4. 获取用户所属组:使用currentUser.GroupIds()函数获取当前用户所属的所有组ID。
  5. 获取组成员:通过调用系统命令getent并解析输出,获取组的所有成员。

这些功能为开发者提供了丰富的工具,能够在系统管理、权限控制等方面高效地处理用户和组的信息。

常见问题及解决方案

在使用os/user包时,可能会遇到一些常见问题。以下是几个常见问题及其解决方案:

1. 无法获取当前用户信息

如果在调用user.Current()时出现错误,通常是由于权限不足或系统不支持。可以尝试以下方法解决:

  • 确保程序具有足够的权限执行该操作。
  • 检查操作系统是否支持获取用户信息的相关功能。
  • 在Linux系统上,可以使用id命令检查当前用户信息:id
2. 无法根据用户名或用户ID查询用户

如果在调用user.Lookup(username)user.LookupId(uid)时出现错误,可能是由于输入的用户名或用户ID不正确。解决方法:

  • 确保输入的用户名或用户ID是正确的。
  • 使用系统命令检查用户信息,例如在Linux系统上使用getent passwd usernamegetent passwd uid
3. 无法根据组名或组ID查询组

如果在调用user.LookupGroup(groupname)user.LookupGroupId(gid)时出现错误,可能是由于输入的组名或组ID不正确。解决方法:

  • 确保输入的组名或组ID是正确的。
  • 使用系统命令检查组信息,例如在Linux系统上使用getent group groupnamegetent group gid
4. 无法获取组成员

由于os/user包本身不直接提供获取组成员的功能,我们通过调用系统命令getent并解析输出来获取组成员信息。如果调用命令时出现错误,可能是由于系统命令不可用或解析输出失败。解决方法:

  • 确保系统上安装并可用getent命令。
  • 检查解析输出的逻辑是否正确,确保能够正确处理命令输出格式。

本文详细介绍了Go语言标准库os/user包的使用方法和技巧,涵盖了获取当前用户信息、查询用户和组信息、获取用户所属组以及获取组成员等内容。通过多个实战案例,我们展示了如何在实际开发中应用这些功能。希望本文能够帮助您更好地掌握os/user包的使用方法,并在项目中灵活应用这些技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2077971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这本大模型书籍我敢说知道的人不超过1%,大模型入门必备书籍

当然可以&#xff01;我为您推荐一本关于大模型的书籍&#xff1a;《Transformer Tutorials: From Theory to Practice》。虽然这本书不是直接以“大模型”命名&#xff0c;但它涵盖了构建和理解大规模语言模型&#xff08;如GPT系列和BERT&#xff09;所需的关键技术和理论。接…

娱乐社交、游戏行业的最新玩法实践与未来增长趋势解读|网易数智x华为云城市沙龙杭州站邀你前来!

随着5G、AI、区块链等前沿技术的深度融合应用&#xff0c;泛娱乐行业正经历深刻变革的同时&#xff0c;也面临着一系列挑战与问题&#xff0c;面对社交产品监管的加强、海外市场的双重机遇与风险以及增速放缓的游戏行业...... 探求新增长点与新思路成为当下泛娱乐行业从业者的关…

收银系统源码助力零售门店数字化升级

一、国内零售业数字化转型迈入深水区 近年来&#xff0c;我国零售业数字化进程显著加速&#xff0c;从线上电商到新零售模式&#xff0c;再到利用大数据、人工智能等技术优化供应链、提升体验&#xff0c;每一步都见证了行业的深刻变革。随着零售行业进入存量市场竞争&#xf…

nuxt3连接mongodb操作

文章目录 创建一个nuxt3应用添加nuxt后端服务nuxt3路由创建mongo数据连接mongodb数据库补充添加显示(用v-for打印出数组)nuxt-server-insertmongodb删除数据创建一个nuxt3应用 Node.js - v18.0.0 或更新版本推荐使用 Visual Studio Code 以及 Volar 扩展npx nuxi@latest init p…

使用jwt实现登录验证

jwt工具类 public class JwtUtil {public static String key"mykey";public static String genToken(String username) {JWTCreator.Builder builder JWT.create();Map<String, Object> headersnew HashMap<>();headers.put("typ","jwt&…

uniapp重新编译在微信开发者工具跳转指定页面

uniapp重新编译在微信开发者工具跳转指定页面 步骤 选择编译模式添加编译模式设置启动页面

rk3588调用NPU、查看npu的使用情况

1、rk3588启用NPU 启用三个内核->RKNNLite.NPU_CORE_0_1_2 rknn_lite RKNNLite(verboseFalse) ret rknn_lite.load_rknn(RKNN_MODEL) ret rknn_lite.init_runtime(core_maskRKNNLite.NPU_CORE_0_1_2) 2、查看NPU使用情况&#xff1a; watch sudo cat /sys/kernel/deb…

LaViT:Less-Attention Vision Transformer的特性与优点

引言 https://arxiv.org/pdf/2406.00427 随着计算机视觉领域的发展&#xff0c;视觉Transformer&#xff08;ViTs&#xff09;逐渐成为一项重要技术。尽管ViTs在捕捉图像中的长距离依赖关系方面表现出色&#xff0c;但其沉重的计算负担和潜在的注意力饱和问题一直是实际应用的…

利用Python对Excel数据进行条件筛选与排序

目录 一、Python与Excel数据处理的基础知识 1.1 Python中的Excel数据处理库 1.2 pandas库简介 二、使用pandas读取Excel数据 三、Excel数据的条件筛选 3.1 单条件筛选 3.2 多条件筛选 3.3 使用query方法 四、Excel数据的排序 4.1 单列排序 4.2 多列排序 五、案例分…

Python自动化:Excel根据IP匹配网段获取所属源端口

需求 现在有两个文件&#xff1a; 1. 【NTP.xlsx】&#xff1a;有name、IP、fenzhihang、vendor、source这五列 2. 【IP.xlsx】&#xff1a;有daqu、fenzhihang、duankou、IP、mask、gateway、subnet、yongtu、miaoshu这九列 现在更新基线&#xff0c;每台设备都需要增加nt…

ET6框架(二)Demo工程的运行及编译

1.工程下载地下&#xff1a; GitHub - egametang/ET at release6.0 2.复制地址后下载&#xff0c;在本人使用时ET已更新到最新9.0的版本&#xff0c;因此下载后需要切换分支到6.0版本 3.下载完工程后可以用 UnityHub打开工程&#xff0c;如没有对应版本可以在&#xff1a;h…

OpenHarmony技术开发:Launcher架构应用启动流程分析

简介 Launcher 作为系统人机交互的首要入口&#xff0c;提供应用图标的显示、点击启动、卸载应用&#xff0c;并提供桌面布局设置以及最近任务管理等功能。 Launcher 采用 扩展的 TS 语言&#xff08;eTS&#xff09;开发&#xff0c;主要的结构如下&#xff1a; product 业务…

安卓13 背光调节非线性问题处理,调节范围不正常问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码修改 4.彩蛋 1.前言 我们看看现在的版本的亮度图 2.问题分析 当背光亮度设置为0%时,每次按下亮度增加键或者 input keyevent BRIGHTNESS_UP,亮度UI的增幅较大,首次按下后亮度平滑提升至大约55%,随后继…

路旁树木种类巡检检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

路旁树木种类巡检检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着城市化进程的加快&#xff0c;城市绿化…

七、面向对象编程(中级)

文章目录 一、IDEA1.1 IDEA下载安装1.2 IDEA的使用1.3 IDEA常用的快捷键 二、包2.1 包的基本介绍2.2 包的本质分析2.3 包的命名2.4 常用的包2.5 如何引入包 三、访问修饰符四、面向对象的三大特征4.1 封装4.2 继承4.2.1 为什么需要继承4.2.2 继承的基本介绍4.2.3 继承的深入讨论…

【C++题解】1222. 经典递归问题——汉诺塔

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1222. 经典递归问题——汉诺塔 类型&#xff1a;递归、函数 题目描述&#xff1a; 汉诺塔&#xff08;又称河内塔&#xff09;问题是印度的一个古老的传说。开天辟地的神勃拉玛在一…

关于武汉芯景科技有限公司的MCU监控芯片XJ809S开发指南(兼容MAX809S)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、功能 当电源电压低于预设阈值时&#xff0c;芯片会发出复位信号&#xff0c;将微处理器或系统重置到初始状态&#xff0c;防止因电源问题导致的系统错误运行。复位信号在电源电压恢复并稳定后至少保持140ms&#xff0c;确保系统有…

HikariCP源码分析之源码环境搭建

一、fork源码库 为了方便记录以及查看一些历史的提交信息&#xff0c;我先在github上fork了这个源码库。 他的原始源码库位置为HikariCP源码位置 在fork到我的源码库之后&#xff0c;我就可以用git clone拉取下来&#xff0c;然后在我本地打开&#xff0c;做一些修改和笔记。然…

点云上采样

【版权声明】本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 参考书籍&#xff1a;《人工智能点云处理及深度学习算法》 本文为专栏《Python三维点云实战宝典》系列文章&#xff0c;专栏介绍地址“【python三维深度学习】python…

mysql regexp匹配多个字符串

项目场景&#xff1a; 数据结构 其中nameArr存储的是名字集合&#xff0c;现在的需求是传入"aaa","fff"&#xff0c;需要把包含这两个name的数据都查出来。 解决方案&#xff1a; 可以使用REGEXP来匹配包含多个特定ID的字符串。使用以下正则表达式&#x…