gpt4 book ai didi

Golang 分组并在 goroutine 中按值合并

转载 作者:IT王子 更新时间:2023-10-29 02:07:48 25 4
gpt4 key购买 nike

我是 go 的新手,并尝试在 go 中使用相同的值填充 slice 数据。引用下面的例子

input struct {
ID string `json:"id"`
Name string `json:"name"`
Image string `json:"image"`
}

output struct {
ID string `json:"id"`
Name string `json:"name"`
Image []img `json:"image"`
}

img struct {
Name string `json:"name"`
Width int `json:"width"`
Height int `json:"height"`
}

input = [{
"id": 10,
"name": "product 10",
"image": {"name": "https://i.imgur.com/eKSk6Fq.jpg"}
}, {
"id": 10,
"name": "product 10",
"image": {"name": "https://i.imgur.com/np1wmxw.jpg"}
}, {
"id": 11,
"name": "product 11",
"image": {"name": "https://i.imgur.com/jlFgGpe.jpg"}
}, {
"id": 11,
"name": "product 11",
"image": {"name": "https://i.imgur.com/B0D4iRk.jpg"}
}, {
"id": 11,
"name": "product 11",
"image": {"name": "https://i.imgur.com/4AiXzf8.jpg"}
}]

// expected output
output = [{
"id": 10,
"name": "product 10",
"image": [{
"name": "https://i.imgur.com/eKSk6Fq.jpg",
"width": 900,
"height": 600
}, {
"name": "https://i.imgur.com/np1wmxw.jpg",
"width": 600,
"height": 600
}]
}, {
"id": 11,
"name": "product 11",
"image": [{
"name": "https://i.imgur.com/jlFgGpe.jpg",
"width": 639,
"height": 700
}, {
"name": "https://i.imgur.com/B0D4iRk.jpg",
"width": 1280,
"height": 960
}, {
"name": "https://i.imgur.com/4AiXzf8.jpg",
"width": 540,
"height": 405
}]
}]

我想根据相同的 IDinput 分组到一个新的 slice,所以结果 output 将是具有相同 ID 的分组 image 的新结构的新 slice 。

  • h̶o̶w̶̶更新:从 Peter Eichelsheim 那里得到了答案
  • 此外,如果我必须使用 http.get 在 input 中获取图像大小并想使用 goroutine,我将如何获得结果?自从我上次在这里输入代码playground没有实现正确的输出(总是得到最后的输入)

注意:我不知道为什么我在 go playground 中得到 null,但在我的笔记本电脑中结果是:[{"id":11,"name":"product 11","image":[{"名称":"https://i.imgur.com/B0D4iRk.jpg ","宽度":1280,"高度":960}]}]

在 PHP 中,我将执行以下操作以实现预期的输出

foreach ($input as $key => $value) {
if (!isset($output[$value["id"]])) {
$output[$value["id"]] = [
"id" => $value["id"],
"name" => $value["name"],
"image" => [],
];
}

$get = getimagesize($value["image"]["name"]);
if ($get) {
$width = isset($get[0]) ? $get[0] : 0;
$height = isset($get[1]) ? $get[1] : 0;
}

$output[$value["id"]]["image"][$key] = [
"name" => $value["image"]["name"],
"width" => $width,
"height" => $height,
];

$output[$value["id"]]["image"] = array_values($output[$value["id"]]["image"]);
}

$output = array_values($output);
$json = json_encode($output, true);

echo $json;

谢谢

最佳答案

这里是一个带有示例 json 输入的小示例,使用 map[int] 输出将图像合并到相同的产品 ID 中。

package main

import (
"encoding/json"
"fmt"
"log"
)

type input struct {
ID int `json:"id"`
Name string `json:"name"`
Image img `json:"image"`
}

type output struct {
ID int `json:"id"`
Name string `json:"name"`
Image []img `json:"image"`
}

type img struct {
Name string `json:"name"`
}

func main() {

var jsoninput = []byte(`
[{
"id": 10,
"name": "product 10",
"image": {"name": "image 10a"}
}, {
"id": 10,
"name": "product 10",
"image": {"name": "image 10b"}
}, {
"id": 11,
"name": "product 11",
"image": {"name": "image 11a"}
}, {
"id": 11,
"name": "product 11",
"image": {"name": "image 11b"}
}, {
"id": 11,
"name": "product 11",
"image": {"name": "image 11c"}
}]`)

var inputs []input

err := json.Unmarshal(jsoninput, &inputs)
if err != nil {
log.Fatalln("could not Unmarshal:", err)
}

var outputlist = make(map[int]output)

for _, inp := range inputs {
outputlist[inp.ID] = output{inp.ID, inp.Name, append(outputlist[inp.ID].Image, inp.Image)}
}

var outputs []output

for _, outp := range outputlist{
outputs = append(outputs,outp)
}

jsonoutput, err := json.Marshal(outputs)

fmt.Println(string(jsonoutput))
}

关于Golang 分组并在 goroutine 中按值合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54552516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com