Maison >développement back-end >Golang >La désorganisation des projets dynamodb renvoie le même projet
L'éditeur PHP Zimo vous présentera aujourd'hui comment résoudre le problème du dissociation des éléments DynamoDB et du renvoi des mêmes éléments. DynamoDB est une base de données clé-valeur sans serveur hautes performances, mais elle peut parfois renvoyer les mêmes éléments lors de leur interrogation, ce qui peut constituer un problème délicat pour les développeurs. Ne vous inquiétez pas, nous vous fournirons une solution pour garantir que les résultats de votre requête sont uniques et corrects. Dans cet article, nous expliquerons en détail la cause du problème et proposerons un moyen simple et efficace de le résoudre. Nous allons jeter un coup d'oeil!
J'ai une boucle de plage en golang qui boucle sur une carte de type.attributevalues
renvoyée par dynamodb à l'aide d'une fonction d'analyse.
J'ai utilisé la fonction intégrée fournie par le package golang aws-sdk-v2 attributevalue.unmarshalmap()
pour parcourir cette carte, et ce qui s'est passé, c'est que j'ai récupéré des éléments de la même longueur que la tranche.
Code :
type users struct { user *string `dynamodbav:"user"` email *string `dynamodbav:"email"` } user := users{} for _ , dbitem := range dynamoresults.items { err = attributevalue.unmarshalmap(dbitem, &user) } // gives the same pointer location for all users[0].user users[1].user users[2].user
J'ai également essayé d'ajouter l'utilisateur à la tranche dans les résultats
// this just gives a slice with the same items as above u := []Users{} for _ , dbItem := range dynamoResults.Items { err = attributevalue.UnmarshalMap(dbItem, &Users) u = append(u, Users) }
La solution que j'ai trouvée en utilisant attributevalue.unmarshallistofmaps()
est simplement de fournir à la fonction une tranche d'éléments de dynamodb.
Ma question est en fait de comprendre pourquoi l'utilisation des deux solutions ci-dessus ne fonctionne pas comme prévu, ne parcourt-elle pas les éléments dynamodb et ne les transmet-il pas individuellement à la fonction unmarshal ? On dirait que je continue à faire la même chose.
Si nous modifions un peu le problème - du démarshalling dynamo db au démarshaling json - alors nous pouvons le faire dans le go terrain de jeu. Dans l'exemple de code, je vois deux facteurs travaillant ensemble pour provoquer des valeurs de tranche en double :
La cible de désorganisation est définie en dehors de la boucle (ligne 51), donc lorsque u1out
est désorganisée, le résultat est écrit au même emplacement à chaque itération de boucle (ligne 54).
user1
类型的字段为 *string
,因此当将循环变量值复制到切片时(第 55 行),user
和 email
ne sera pas copiée. Seules leurs valeurs de pointeur sont copiées.
user
et email
non marshallées dans le même emplacement mémoire. Ceci est démontré par les deux premières lignes de sortie, qui impriment des éléments de . user
和 email
值写入同一内存位置。输出的前两行证明了这一点,它们打印 u1out
). Dans chaque cas, de nouveaux emplacements de valeurs non regroupées sont créés comme prévu et les doublons ne sont pas imprimés. u1in
和 u2in
)或字段更改为 string
(u2out
package main import ( "encoding/json" "fmt" ) type ( Users1 struct { User *string Email *string } Users2 struct { User string Email string } ) func main() { dbItems := []string{ `{"User":"userA","Email":"<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="a7d2d4c2d5e6e7c2dfc6cad7cbc289c4c8ca">[email protected]</a>"}`, `{"User":"userB","Email":"<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="5a2f293f28181a3f223b372a363f74393537">[email protected]</a>"}`, } u1Out := withVarDeclaredOutsideLoop[Users1](dbItems) printUsers(u1Out) u1In := withVarDeclaredInsideLoop[Users1](dbItems) printUsers(u1In) u2Out := withVarDeclaredOutsideLoop[Users2](dbItems) printUsers(u2Out) u2In := withVarDeclaredInsideLoop[Users2](dbItems) printUsers(u2In) // Output // u[0] = {User:0xc000014130 Email:0xc000014140} // u[1] = {User:0xc000014130 Email:0xc000014140} // u[0] = {User:0xc0000141c0 Email:0xc0000141d0} // u[1] = {User:0xc000014210 Email:0xc000014220} // u[0] = {User:userA Email:<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="86f3f5e3f4c7c6e3fee7ebf6eae3a8e5e9eb">[email protected]</a>} // u[1] = {User:userB Email:<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="07727462754547627f666a776b622964686a">[email protected]</a>} // u[0] = {User:userA Email:<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="98edebfdead9d8fde0f9f5e8f4fdb6fbf7f5">[email protected]</a>} // u[1] = {User:userB Email:<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="fe8b8d9b8cbcbe9b869f938e929bd09d9193">[email protected]</a>} } func withVarDeclaredOutsideLoop[T any](dbItems []string) []T { var t T u := []T{} for _, dbItem := range dbItems { json.Unmarshal([]byte(dbItem), &t) u = append(u, t) } return u } func withVarDeclaredInsideLoop[T any](dbItems []string) []T { u := []T{} for _, dbItem := range dbItems { var t T json.Unmarshal([]byte(dbItem), &t) u = append(u, t) } return u } func printUsers[T any](u []T) { for i, user := range u { fmt.Printf("u[%d] = %+v\n", i, user) } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!