首页 > 后端开发 > Golang > 解组 dynamodb 项目返回相同的项目

解组 dynamodb 项目返回相同的项目

PHPz
发布: 2024-02-08 23:00:11
转载
1052 人浏览过

解组 dynamodb 项目返回相同的项目

php小编子墨今天为大家介绍如何解决解组 DynamoDB 项目返回相同的项目的问题。DynamoDB 是一种高性能、无服务器的键值数据库,但有时候在查询项目时可能会出现返回相同项目的情况,这对于开发者来说是一个棘手的问题。不用担心,我们将为您提供一种解决方案,以确保您的查询结果唯一且正确。在本文中,我们将详细解释问题的原因,并提供一种简单有效的方法来解决这个问题。让我们一起来看看吧!

问题内容

我在 golang 中有一个范围循环,它循环使用 dynamodb 使用扫描函数返回的 type.attributevalues 的映射。

我使用 golang aws-sdk-v2 包 attributevalue.unmarshalmap() 提供的内置函数循环遍历这片地图,发生的情况是我得到了与切片长度相同的项目的返回。

代码:

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
登录后复制

我还尝试将用户附加到结果中的切片中

// 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)
       }
登录后复制

我发现使用 attributevalue.unmarshallistofmaps() 的解决方案只需为该函数提供来自 dynamodb 的 items 切片即可。

我的问题实际上是要理解为什么使用上述两个解决方案不能按预期工作,不会循环遍历 dynamodb 项并将它们单独传递给 unmarshal 函数吗?看来只是继续做同样的事情。

解决方法

如果我们稍微改变一下问题——从 dynamo db 解组到 json 解组——那么我们就可以在 go 游乐场。在示例代码中,我看到两个因素共同作用导致了重复的切片值:

  1. 解组目标是在循环外部定义的(第 51 行),因此当解组 u1out 时,结果会写入每次循环迭代的同一位置(第 54 行)。

  2. user1 类型的字段为 *string,因此当将循环变量值复制到切片时(第 55 行),useremail 指向的字符串不会被复制。仅复制它们的指针值。

将这两个放在一起,每次迭代都会将未编组的 useremail 值写入同一内​​存位置。输出的前两行证明了这一点,它们打印 useremail 值写入同一内​​存位置。输出的前两行证明了这一点,它们打印 u1out 的元素。

输出的其余行显示其他三种情况下的结果:当目标变量在循环内移动(u1inu2in)或字段更改为 stringu2out)时。在每种情况下,都会按预期创建未编组值的新位置,并且不会打印重复项。

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&#160;protected]</a>"}`,
        `{"User":"userB","Email":"<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="5a2f293f28181a3f223b372a363f74393537">[email&#160;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&#160;protected]</a>}
    // u[1] = {User:userB Email:<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="07727462754547627f666a776b622964686a">[email&#160;protected]</a>}
    // u[0] = {User:userA Email:<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="98edebfdead9d8fde0f9f5e8f4fdb6fbf7f5">[email&#160;protected]</a>}
    // u[1] = {User:userB Email:<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="fe8b8d9b8cbcbe9b869f938e929bd09d9193">[email&#160;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)
    }
}
登录后复制

以上是解组 dynamodb 项目返回相同的项目的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板