如何将接口内的值转换为golang中的映射?
How to convert the value inside an interface into a map in golang?
我是GO的新手
我的objective是获取item.Data里面的数据,然后放到一个map中,这样我就可以把它们作为键值对来访问了。
据我了解,空接口与 Typescript 中的任何类型相同。
能否请您分享一下如何在 goLang 中执行此操作的片段?
type SearchLogsResponse struct {
// The underlying http response
RawResponse *http.Response
// A list of SearchResponse instances
SearchResponse `presentIn:"body"`
// For list pagination. When this header appears in the response, additional pages
// of results remain. For important details about how pagination works, see
// List Pagination (https://docs.cloud.oracle.com/iaas/Content/API/Concepts/usingapi.htm#nine).
OpcNextPage *string `presentIn:"header" name:"opc-next-page"`
// Unique Oracle-assigned identifier for the request. If you need to contact
// Oracle about a particular request, please provide the request ID.
OpcRequestId *string `presentIn:"header" name:"opc-request-id"`
}
// SearchResult 一个日志搜索结果条目
type SearchResult struct {
// JSON blob containing the search entry with projected fields.
Data *interface{} `mandatory:"true" json:"data"`
}
// SearchResponse Search response object.
type SearchResponse struct {
Summary *SearchResultSummary `mandatory:"true" json:"summary"`
// List of search results
Results []SearchResult `mandatory:"false" json:"results"`
// List of log field schema information.
Fields []FieldInfo `mandatory:"false" json:"fields"`
}
res, err1 := o.loggingSearchClient.SearchLogs(ctx, request)
for _, item := range res.Results {
//TODO create a map string [string]
// Put key value pairs from item into the above map
}
P.S:item.Data里面的数据是一个键值对列表,其中每个键可以包含另一个接口里面的数据,其值为字符串
编辑:键是动态的
首先:不要使用*interface{}
,而是使用interface{}
。
您可以使用类型断言来测试 Data
的基础类型,如果它是 map[string]interface{}
:
则递归下降
(您提到这是 SDK 的一部分,无法更改,因此解决方法是取消引用接口)
if m, ok:=(*item.Data).(map[string]interface{}); ok {
// m is a map[string]interface{}
etag:=m["data.eTag"]
// etag is an interface{}
if str, ok:=etag.(string); ok {
// str contains the string value
}
}
我是GO的新手
我的objective是获取item.Data里面的数据,然后放到一个map中,这样我就可以把它们作为键值对来访问了。
据我了解,空接口与 Typescript 中的任何类型相同。
能否请您分享一下如何在 goLang 中执行此操作的片段?
type SearchLogsResponse struct {
// The underlying http response
RawResponse *http.Response
// A list of SearchResponse instances
SearchResponse `presentIn:"body"`
// For list pagination. When this header appears in the response, additional pages
// of results remain. For important details about how pagination works, see
// List Pagination (https://docs.cloud.oracle.com/iaas/Content/API/Concepts/usingapi.htm#nine).
OpcNextPage *string `presentIn:"header" name:"opc-next-page"`
// Unique Oracle-assigned identifier for the request. If you need to contact
// Oracle about a particular request, please provide the request ID.
OpcRequestId *string `presentIn:"header" name:"opc-request-id"`
}
// SearchResult 一个日志搜索结果条目
type SearchResult struct {
// JSON blob containing the search entry with projected fields.
Data *interface{} `mandatory:"true" json:"data"`
}
// SearchResponse Search response object.
type SearchResponse struct {
Summary *SearchResultSummary `mandatory:"true" json:"summary"`
// List of search results
Results []SearchResult `mandatory:"false" json:"results"`
// List of log field schema information.
Fields []FieldInfo `mandatory:"false" json:"fields"`
}
res, err1 := o.loggingSearchClient.SearchLogs(ctx, request)
for _, item := range res.Results {
//TODO create a map string [string]
// Put key value pairs from item into the above map
}
P.S:item.Data里面的数据是一个键值对列表,其中每个键可以包含另一个接口里面的数据,其值为字符串
编辑:键是动态的
首先:不要使用*interface{}
,而是使用interface{}
。
您可以使用类型断言来测试 Data
的基础类型,如果它是 map[string]interface{}
:
(您提到这是 SDK 的一部分,无法更改,因此解决方法是取消引用接口)
if m, ok:=(*item.Data).(map[string]interface{}); ok {
// m is a map[string]interface{}
etag:=m["data.eTag"]
// etag is an interface{}
if str, ok:=etag.(string); ok {
// str contains the string value
}
}