Golang中如何仅使用切片变量获取特定值

Golang中如何仅使用切片变量获取特定值 我是Go语言的新用户。 我已经成功使用了这个库:GitHub - Nerzal/gocloak: golang keycloak client来连接Keycloak。现在,我只需要列出用户名。 目前,我只能获取所有属性……

有一个参数结构体:

type GetUsersParams struct {
    BriefRepresentation *bool   `json:"briefRepresentation,string,omitempty"`
    Email               *string `json:"email,omitempty"`
    EmailVerified       *bool   `json:"emailVerified,string,omitempty"`
    Enabled             *bool   `json:"enabled,string,omitempty"`
    Exact               *bool   `json:"exact,string,omitempty"`
    First               *int    `json:"first,string,omitempty"`
    FirstName           *string `json:"firstName,omitempty"`
    IDPAlias            *string `json:"idpAlias,omitempty"`
    IDPUserID           *string `json:"idpUserId,omitempty"`
    LastName            *string `json:"lastName,omitempty"`
    Max                 *int    `json:"max,string,omitempty"`
    Q                   *string `json:"q,omitempty"`
    Search              *string `json:"search,omitempty"`
    Username            *string `json:"username,omitempty"`
}

还有这个函数:

func (client *gocloak) GetUsers(ctx context.Context, token, realm string, params GetUsersParams) ([]*User, error) {
    const errMessage = "could not get users"

    var result []*User
    queryParams, err := GetQueryParams(params)
    if err != nil {
        return nil, errors.Wrap(err, errMessage)
    }

    resp, err := client.getRequestWithBearerAuth(ctx, token).
        SetResult(&result).
        SetQueryParams(queryParams).
        Get(client.getAdminRealmURL(realm, "users"))

    if err := checkForError(resp, err, errMessage); err != nil {
        return nil, err
    }

    return result, nil
}

像这样调用这个函数时,它可以工作: userlist, err := client.GetUsers(ctx, token.AccessToken, "testrealm", gocloak.GetUsersParams{}) 我想通过在GetUsersParams中传递值来只获取用户名,我尝试了但没能找到方法,有人能帮我吗?


更多关于Golang中如何仅使用切片变量获取特定值的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

我发现了,它们是指针,所以我必须像这样绕过:

for _, toto := range totos {
    fmt.Printf("%+v\n", *(toto.Username))
    //fmt.Printf("%+v", *(toto.Email))
    //fmt.Printf("%+v", *(toto.FirstName))
}

更多关于Golang中如何仅使用切片变量获取特定值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,要从切片中提取特定字段(如用户名),可以使用map函数或循环遍历切片。对于gocloak库返回的[]*User切片,每个User结构体包含Username字段。

以下是两种实现方式:

方法1:使用循环遍历切片

// 获取用户列表
userlist, err := client.GetUsers(ctx, token.AccessToken, "testrealm", gocloak.GetUsersParams{})
if err != nil {
    log.Fatal(err)
}

// 提取用户名到新切片
var usernames []string
for _, user := range userlist {
    if user.Username != nil {
        usernames = append(usernames, *user.Username)
    }
}

// 使用usernames切片
fmt.Println(usernames)

方法2:使用函数式映射(Go 1.18+泛型)

// 泛型map函数
func mapUsers[T any, U any](users []*T, f func(*T) U) []U {
    result := make([]U, 0, len(users))
    for _, user := range users {
        result = append(result, f(user))
    }
    return result
}

// 使用示例
userlist, err := client.GetUsers(ctx, token.AccessToken, "testrealm", gocloak.GetUsersParams{})
if err != nil {
    log.Fatal(err)
}

usernames := mapUsers(userlist, func(u *gocloak.User) string {
    if u.Username != nil {
        return *u.Username
    }
    return ""
})

// 过滤空字符串(可选)
var filteredUsernames []string
for _, name := range usernames {
    if name != "" {
        filteredUsernames = append(filteredUsernames, name)
    }
}

fmt.Println(filteredUsernames)

方法3:直接处理指针字段 如果只需要第一个用户名或特定用户:

userlist, err := client.GetUsers(ctx, token.AccessToken, "testrealm", gocloak.GetUsersParams{})
if err != nil {
    log.Fatal(err)
}

// 获取第一个用户的用户名
if len(userlist) > 0 && userlist[0].Username != nil {
    firstUsername := *userlist[0].Username
    fmt.Println(firstUsername)
}

// 查找特定用户名
targetUsername := "admin"
for _, user := range userlist {
    if user.Username != nil && *user.Username == targetUsername {
        fmt.Printf("找到用户: %s\n", targetUsername)
        break
    }
}

注意:gocloak库中的Username字段是指针类型(*string),因此在访问前需要检查是否为nil。如果确定所有用户都有用户名,可以简化空值检查,但建议保持防御性编程。

回到顶部