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
我发现了,它们是指针,所以我必须像这样绕过:
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。如果确定所有用户都有用户名,可以简化空值检查,但建议保持防御性编程。

