Golang группа и слияние по значению в goroutine - PullRequest
0 голосов
/ 06 февраля 2019

Я новичок в работе и попытался заполнить данные среза теми же значениями в GO.Обратитесь к следующему примеру

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
    }]
}]

Я бы хотел сгруппировать input в новый фрагмент, основанный на том же ID, поэтому в результате output будет новый фрагмент новой структуры с сгруппированным image с таким же ID.

  • H̶o̶w̶ ̶w̶o̶u̶l̶d̶ ̶I̶ ̶a̶c̶h̶i̶e̶v̶e̶d̶ ̶t̶h̶e̶ ̶ ̶o̶u̶t̶p̶u̶t̶ ̶ ̶r̶e̶s̶u̶l̶t̶ ̶u̶s̶i̶n̶̶̶̶̶G?Обновление: получил ответ от Питера Эйхельсхайма
  • Кроме того, если бы мне нужно было получить размер изображения в input с http.get и захотеть использовать goroutine, как бы я достиг результата?так как мой последний код здесь детская площадка не удается получить правильный вывод (всегда получаю последний ввод)у моего ноутбука результат такой: [{"id": 11, "name": "product 11", "image": [{"name": "https://i.imgur.com/B0D4iRk.jpg","width":1280,"height":960}]}]

    В PHP я бы что-то сделалниже для достижения намеченного output.

    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;
    

    Спасибо

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вот небольшой пример с примером ввода json с использованием вывода map [int] для объединения изображений в один и тот же идентификатор продукта.

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))
}
0 голосов
/ 06 февраля 2019
var inputs []input // assuming the json has been unmarshalled correctly

outs := make(map[int]output)

// this will create a map, keyed by id, values are groups of inputs
for _, input := range inputs {

    out, exists := outs[input.ID]
    if !exists {
        out = output{
            ID: input.ID,
            Name: input.Name,
        }
    }

   out.Image = append(out.Image, img{Name: input.Name})
}

output := make([]output, len(outs))
var idx int
for key, out := range outs {
    output[idx] = out
    idx++
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...