第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何定義具有不同字段類型的 GoLang 結構

如何定義具有不同字段類型的 GoLang 結構

Go
慕虎7371278 2022-08-24 17:02:58
我對GoLang比較陌生,并且在嚴格的類型系統(tǒng)中遇到了麻煩(我更習慣于弱類型語言)。在嘗試編寫Alexa智能家居技能時,我需要創(chuàng)建定義(例如)的JSON結構 https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-contactsensor.html國家報告回應是我開始遇到麻煩的地方,特別是在上下文中。該示例如下所示:  "context": {    "properties": [      {        "namespace": "Alexa.ContactSensor",        "name": "detectionState",        "value": "NOT_DETECTED",        "timeOfSample": "2017-02-03T16:20:50.52Z",        "uncertaintyInMilliseconds": 0      },      {        "namespace": "Alexa.EndpointHealth",        "name": "connectivity",        "value": {          "value": "OK"        },        "timeOfSample": "2017-02-03T16:20:50.52Z",        "uncertaintyInMilliseconds": 0      }    ]  }乍一看,這看起來很簡單:    Context struct {        Properties []struct {            Namespace                 string    `json:"namespace"`            Name                      string    `json:"name"`            Value                     string    `json:"value"`            Timeofsample              time.Time `json:"timeOfSample"`            Uncertaintyinmilliseconds int       `json:"uncertaintyInMilliseconds"`        } `json:"properties"`    } `json:"context"`但是“值”字段是我遇到問題的地方。在數(shù)組的第一個元素中,我們有一個簡單的字符串        "value": "NOT_DETECTED",但第二個元素是一個結構        "value": {          "value": "OK"        },(這似乎不是文檔中的拼寫錯誤;它在 https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-endpointhealth.html 和其他地方也重復出現(xiàn))。這就是GoLang的嚴格輸入和我對語言的了解開始擊敗我的地方。如何對此元素進行建模,因為它似乎沒有固定類型?value還是有更好的方法來做到這一點?
查看完整描述

2 回答

?
夢里花落0921

TA貢獻1772條經(jīng)驗 獲得超6個贊

創(chuàng)建一個類似如下的類型:


import (

    "bytes"

    "encoding/json"

    "fmt"

)


// nullOK is a JSON OK literal

var nullOK = []byte("OK")


type ValueString struct {

    Error string

    Valid bool

}


// UnmarshalJSON implements json.Unmarshaler.

func (s *ValueString) UnmarshalJSON(data []byte) error {

    if bytes.Equal(data, nullOK) {

        s.Valid = true

        return nil

    }


    if err := json.Unmarshal(data, &s.Error); err != nil {

        return fmt.Errorf("checking OK: couldn't unmarshal JSON: %w", err)

    }


    s.Valid = false

    return nil

}


// MarshalJSON implements json.Marshaler.

func (s ValueString) MarshalJSON() ([]byte, error) {

    if s.Valid {

        return []byte("OK"), nil

    }

    return json.Marshal(s.Error)

}

并在您的結構中使用它:


...

Value                     ValueString    `json:"value"`

...

當值為“OK”時,您的將是 ,否則請檢查解析值。Value.ValidtrueValue.Error


查看完整回答
反對 回復 2022-08-24
?
泛舟湖上清波郎朗

TA貢獻1818條經(jīng)驗 獲得超3個贊

使用mkopriva的提示,我想我提出了使用和匿名結構的簡單概念驗證解決方案interface{}


package main


import "encoding/json"

import "fmt"


type Foo struct {

        Value interface{} `json:"value"`

}


func main() {

        v1 := Foo{Value: "version1"}

        j1, _ := json.Marshal(v1)

        fmt.Println(string(j1))


        v2 := Foo{Value: struct {

                Value string `json:"value"`

        }{Value: "version2"}}

        j2, _ := json.Marshal(v2)

        fmt.Println(string(j2))

}

運行此命令會得到兩個輸出:


{"value":"version1"}

{"value":{"value":"version2"}}


查看完整回答
反對 回復 2022-08-24
  • 2 回答
  • 0 關注
  • 83 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號