1. Куча / Говнокод #19746

    +5

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    type asynchronizer struct {
    	payload interface{}
    }
    
    func (as *asynchronizer) MarshalJSON() ([]byte, error) {
    	insert := []byte("\"async\":true,")
    	if as.payload == nil {
    		as.payload = struct{}{}
    	}
    	raw, err := json.Marshal(as.payload)
    	if err != nil {
    		return raw, err
    	}
    	if raw[1] == '}' {
    		insert = insert[:len(insert)-2]
    	}
    	return append(append(raw[0:1], insert...), raw[1:]...), nil
    }

    Чем дальше в лес, тем больше Го напоминает ПХП.

    Запостил: wvxvw, 03 Апреля 2016

    Комментарии (28) RSS

    • >raw[0:1]
      raw[0]?
      Ответить
    • > тем больше Го напоминает ПХП
      И чем же? Тем, что писать на нём могут даже обезьяны?
      Ответить
      • Гибкостью.
        Ответить
        • Типа остальные языки недостаточно гибки, чтобы в них можно было приконкатенировать async:true к фигне, сериализованной в json...
          Ответить
          • https://youtu.be/B2xemOY5Ws0?t=891
            Ответить
          • Ну как бы смысл в том, что по-нормальному не сделать (нельзя как-то JSON сериализатору намекнуть, что нужно еще одно поле добавить.) Запросы все разного типа, т.е. встроить их в asynchronizer не получится. Можно либо плодить по две версии каждого запроса, типа:

            type SystemStart struct {
                SystemID SystemID `json:"system_id"`
                ...
            }
            type SystemStartAsync struct {
                Async bool `json:"async"`
                SystemID SystemID `json:"system_id"`
                ...
            }


            Либо делать все запросы одного типа (со всеми возможными полями...) и потом пытаться угадать, какой именно из них к нам пришел.
            Ответить
            • Унаследовать все запросы от какого-то общего класса, где будет поле async нельзя?

              Ну либо сделать транспортный конвертик: { "async": true, "payload": { ... } }. Хотя такое, наверное, совместимость не позволит...
              Ответить
              • Нет, наследования в Го нет. Можно только как в Сишке - встроить структуру / указатель в структуру, но когда все дети уже созданы разными - то тут уже ничего не поделать.
                Можно нагенерировать этих классов, но не хочется.
                Ответить
              • > Унаследовать все запросы от какого-то общего класса, где будет поле async нельзя?

                Это примерно то, что я хотел предложить. Можно сделать что-то подобное
                type RequestBase struct {
                    Async bool `json:"async"`
                }
                
                type SystemStart struct {
                    RequestBase
                    SystemID SystemID `json:"system_id"`
                }
                
                type OtherRequest struct {
                    RequestBase
                    // ...
                }
                И тогда сериализатор выведет ровно то, что требуется в топике.
                Ответить
                • Этот вариант не подходит, т.как исходные структуры изменять нельзя по ряду независимых причин. Ну и плюс сериализатор не выдаст то же самое, будет async: false, в противном случае.
                  Ответить
                  • > будет async: false, в противном случае
                    Это так ужасно? На другом конце парсер писали индусы, которые не читают значение async'а, а смотрят только на его наличие?
                    Ответить
                    • То, что будет async: false - не страшно, но менять все равно нельзя. Одна из причин: эти же объекты получаются из конфигурации, где настройки синхронно/асинхронно быть не должно (програма сама должна решить как посылать). Т.е. можно было бы дополнительно после конфигурации еще проверить и то, что эту настройку не передали - но это будет еще большим говном по примерно таким же причинам.
                      Ответить
                • Внутренности анонимных полей вываливаются во внешний скоп, примерно как значения сишных енумов?
                  Ответить
                  • Это называется embedding, специальный синтаксический сахар. Они не вываливаются, для них как-бы создаются алиасы. Т.е. можно по-честному писать request.BaseRequest.Async.
                    http://www.hydrogen18.com/blog/golang-embedding.html
                    Ответить
                • Может как-то так тогда?
                  type Asynchronizer struct {
                      Async bool `json:"async"`
                      interface{}
                  }
                  Но как в это анонимное поле что-то засунуть? async.interface = xxx?
                  Ответить
              • Второй вариант, который более точно отражает всю толщину костыля, забитого топик-стартером:
                raw, err := json.Marshal(payload)
                if err != nil {
                    return raw, err
                }
                rawObject := make(map[string]interface{})
                err = json.Unmarshal(b, &rawObject)
                if err != nil {
                    return nil, err
                }
                rawObject["async"] = true
                return json.Marshal(rawObject)
                LexicalCast, однако.
                Ответить
                • Ну, это такое же говно, как и оригинал, только с той разницей, что тут две конвертации вместо одной.
                  Ответить
                • В жс так объекты клонируют :)
                  Ответить
                  • Ох уже это прототипное программирование...
                    Ответить
        • Идет мужик по красной площади,и вдруг срать захотел. Сел, сделал дело,смотрит мент к нему бежит,мужик не растерялся и накрыл какашку своей шляпой. Мент подходит и спрашивает-
          слышь, мужик, че под шляпой прячешь? Да вот шустрика поймал. Мент-давай показывай, что за шустрик. М.-не не могу - убежит опять и так еле поймал.мент-ну давай ты на счет 3 приподнимаешь шляпу,а я его рукой схвачу..Ну давай,мужик приподнимает шляпу..мент хватает его рукой и говорит-нифига себе, какой шустрый аж сквозь пальцы проскальзывает
          Ответить
    • Го напоминает гоатсе.
      Ответить

    Добавить комментарий