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 
} 

Warum funktioniert das nicht? Es hat keinen Fehler geworfen, einfach nicht funktioniert ... Mein Tipp ist etwas falsch mit meinem UserInfo Typ, aber kann nicht den richtigen Weg, dies zu tun, helfen, bitte.UnmarshalMap mit aws-go-sdk

Antwort

2

In Go wird ein Name exportiert, wenn er mit einem Großbuchstaben beginnt. Sie sollten die ersten Buchstaben der Felder groß geschrieben machen, um sicherzustellen, dass sie exportiert werden, wie:

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

weitere Informationen: https://www.goinggo.net/2014/03/exportedunexported-identifiers-in-go.html

+0

Das funktioniert! Aber sollten hier keine Warnungen oder Fehler gepostet werden? Ich meine, Docs haben nichts dazu gesagt. – FrontMage

+0

Ich frage mich, ob es eine bequeme Möglichkeit gibt, Werte einer Struktur zu einer anderen zu wählen. – FrontMage

+0

@FrontMage Der Grund, warum Mitglieder ihr erstes Zeichen in Großbuchstaben schreiben müssen, ist, dass keine Go-Bibliothek eines anderen Pakets auf ein Mitglied, eine Methode, einen Typ oder Wert eines anderen Pakets zugreifen kann, wenn das erste Zeichen nicht in Großbuchstaben ist. In allen Go-Marshalling-Bibliotheken wird dasselbe Verhalten angezeigt. –