我正在开发一个API客户端,我需要根据请求对JSON有效负载进行编码,并从响应中解码JSON主体.
我已经阅读了几个库的源代码,从我看到的,我基本上有两种编码和解码JSON字符串的可能性.
使用json.Unmarshal
传递整个响应字符串
data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
err = json.Unmarshal(data, value)
}
Run Code Online (Sandbox Code Playgroud)
或使用 json.NewDecoder.Decode
err = json.NewDecoder(resp.Body).Decode(value)
Run Code Online (Sandbox Code Playgroud)
在我的情况下,当处理实现的HTTP响应时,io.Reader
第二个版本似乎需要更少的代码,但是因为我已经看到两者我想知道是否有任何偏好我是否应该使用解决方案而不是另一个.
此外,从这个问题接受的答案说
请使用
json.Decoder
而不是json.Unmarshal
.
但它没有提到原因.我真的应该避免使用json.Unmarshal
吗?
什么是__CODE__
用于提取的最后一个元素的方式__CODE__
?
var slice []int
slice = append(slice, 2)
slice = append(slice, 7)
slice[len(slice)-1:][0] // Retrieves the last element
Run Code Online (Sandbox Code Playgroud)
上面的解决方案有效,但似乎很尴尬.
我正在尝试从Web读取JSON数据,但该代码返回空结果.我不确定我在这里做错了什么.
package main
import "os"
import "fmt"
import "net/http"
import "io/ioutil"
import "encoding/json"
type Tracks struct {
Toptracks []Toptracks_info
}
type Toptracks_info struct {
Track []Track_info
Attr []Attr_info
}
type Track_info struct {
Name string
Duration string
Listeners string
Mbid string
Url string
Streamable []Streamable_info
Artist []Artist_info
Attr []Track_attr_info
}
type Attr_info struct {
Country string
Page string
PerPage string
TotalPages string
Total string
}
type Streamable_info struct {
Text string
Fulltrack string
}
type Artist_info struct {
Name string …
Run Code Online (Sandbox Code Playgroud) 我无法弄清楚如何初始化嵌套结构.在这里找一个例子:http: //play.golang.org/p/NL6VXdHrjh
package main
type Configuration struct {
Val string
Proxy struct {
Address string
Port string
}
}
func main() {
c := &Configuration{
Val: "test",
Proxy: {
Address: "addr",
Port: "80",
},
}
}
Run Code Online (Sandbox Code Playgroud) 我想打开一个本地文件,然后返回一个io.Reader.原因是我需要将io.Reader提供给我正在使用的库,例如:
func read(r io.Reader) (results []string) {
}
Run Code Online (Sandbox Code Playgroud) 我正在通过优秀的Tour of Go工作.我使用以下解决方案完成了其中一个练习(#45):
func Pic(dx, dy int) [][]uint8 {
pic := make([][]uint8, dy) /* type declaration */
for i := range pic {
pic[i] = make([]uint8, dx) /* again the type? */
for j := range pic[i] {
pic[i][j] = uint8((i+j)/2)
}
}
return pic
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我必须使用两次类型的make
语句uint8
(请参阅代码段中的注释).这似乎是多余的,但我无法弄清楚如何以另一种方式做到这一点.
我有一个接口Model
,由struct实现Person
.
要获取模型实例,我有以下帮助函数:
func newModel(c string) Model {
switch c {
case "person":
return newPerson()
}
return nil
}
func newPerson() *Person {
return &Person{}
}
Run Code Online (Sandbox Code Playgroud)
上面的方法允许我返回一个正确类型的Person实例(稍后可以使用相同的方法轻松添加新模型).
当我尝试做类似的事情来返回一片模型时,我得到一个错误.码:
func newModels(c string) []Model {
switch c {
case "person":
return newPersons()
}
return nil
}
func newPersons() *[]Person {
var models []Person
return &models
}
Run Code Online (Sandbox Code Playgroud)
去投诉: cannot use newPersons() (type []Person) as type []Model in return argument
我的目标是回到请求任何机型的切片(是否[]Person
,[]FutureModel
,[]Terminator2000
,W/E).我缺少什么,我该如何正确实施这样的解决方案?
我是Golang的新手.
我正在实现一个小型TCP服务器,如何知道我的一个客户是否已关闭?我应该尝试阅读或写入并检查错误是否为零?
我想创建一个container/list.List
实例映射.这是正确的方法吗?
package main
import (
"fmt"
"container/list"
)
func main() {
x := make(map[string]*list.List)
x["key"] = list.New()
x["key"].PushBack("value")
fmt.Println(x["key"].Front().Value)
}
Run Code Online (Sandbox Code Playgroud) 在Golang中有一种优雅的方式可以从像Python这样的数组中进行多项赋值吗?这是我正在尝试做的Python示例(拆分字符串然后将结果数组分配给两个变量).
python:
>>> a, b = "foo;bar".split(";")
Run Code Online (Sandbox Code Playgroud)
我目前的解决方案是:
x := strings.Split("foo;bar", ";")
a, b := x[0], x[1]
Run Code Online (Sandbox Code Playgroud)
我可以看到这在一些结构中变得混乱.我目前面临的一个实际例子是书签文件解析并分配给地图:
bookmark := make(map[string]string)
x := strings.Split("foo\thttps://bar", "\t")
name, link := x[0], x[1]
bookmark[name] = link
Run Code Online (Sandbox Code Playgroud)
现在我坐着一个无用的变量"x".我想做点什么:
bookmark := make(map[string]string)
name, line := strings.Split("foo\thttps://bar", "\t")
bookmark[name] = link
Run Code Online (Sandbox Code Playgroud)
但那是无效的.