2017-08-22 4 views
0
// UserInfo 用来解构返回的数据 
type UserInfo struct { 
    gender  string   `dynamo:"gender"` 
    product string   `dynamo:"product"` 
    id   string   `dynamo:"id"` 
    createTime int    `dynamo:"create_time"` 
    name  string   `dynamo:"name"` 
} 

// GetUserInfoByID 根据userId在supe_user表取回用户信息 
func GetUserInfoByID(userId string) (UserInfo, error) { 
    queryInput := dynamodb.GetItemInput{ 
     Key: map[string]*dynamodb.AttributeValue{ 
      "userId": { 
       S: aws.String(userId), 
      }, 
     }, 
     TableName: aws.String("user"), 
    } 
    result, err := dbsession.DynamoDB.GetItem(&queryInput) 
    userInfo := UserInfo{} 
    if err != nil { 
     fmt.Println(err.Error()) 
     return userInfo, err 
    } 
    unmarshalMapErr := dynamodbattribute.UnmarshalMap(result.Item, &userInfo) 
    if unmarshalMapErr != nil { 
     return userInfo, err 
    } 
    fmt.Println(result.Item) 
    fmt.Println(userInfo.name) 
    return userInfo, nil 
} 

Pourquoi cela ne fonctionne-t-il pas? Il n'a jeté aucune erreur, juste ne fonctionne pas ... Ma conjecture est quelque chose de mal avec mon type UserInfo, mais ne peut pas trouver la bonne façon de le faire, aide, s'il vous plaît.UnmarshalMap utilisant aws-go-sdk

Répondre

2

Dans Go, un nom est exporté s'il commence par une lettre majuscule. Vous devriez faire les premières lettres de champs pour se assurer en majuscules qu'ils sont exportés, comme:

type UserInfo struct { 
    Gender  string   `dynamo:"gender"` 
    Product string   `dynamo:"product"` 
    Id   string   `dynamo:"id"` 
    CreateTime int    `dynamo:"create_time"` 
    Name  string   `dynamo:"name"` 
} 

plus d'info: https://www.goinggo.net/2014/03/exportedunexported-identifiers-in-go.html

+0

Cela fonctionne! Mais ne devrait pas être un avertissement ou des erreurs affichées ici? Je veux dire que les docs n'ont rien dit à ce sujet .... – FrontMage

+0

Je me demande s'il existe un moyen pratique de choisir les valeurs d'une structure à une autre. – FrontMage

+0

@FrontMage La raison pour laquelle les membres doivent mettre leur premier caractère en majuscule est qu'aucune bibliothèque Go d'un package différent ne peut accéder à un membre, une méthode, un type ou une valeur d'un autre package si le premier caractère n'est pas mis en majuscule. Vous verrez voir le même comportement dans toutes les bibliothèques de marshaling Go. –