小编Dav*_*e C的帖子

使用json.Unmarshal vs json.NewDecoder.Decode解码Golang中的JSON

我正在开发一个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吗?

json go

174
推荐指数
2
解决办法
5万
查看次数

切片的最后一个元素

什么是__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)

上面的解决方案有效,但似乎很尴尬.

go slice

152
推荐指数
3
解决办法
11万
查看次数

如何在Golang中获得JSON响应

我正在尝试从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)

json go

110
推荐指数
4
解决办法
15万
查看次数

在Golang中初始化一个嵌套的结构

我无法弄清楚如何初始化嵌套结构.在这里找一个例子: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)

go

108
推荐指数
7
解决办法
12万
查看次数

golang:从本地文件创建一个io.Reader

我想打开一个本地文件,然后返回一个io.Reader.原因是我需要将io.Reader提供给我正在使用的库,例如:

func read(r io.Reader) (results []string) {

}
Run Code Online (Sandbox Code Playgroud)

go

70
推荐指数
4
解决办法
6万
查看次数

切片类型

我正在通过优秀的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(请参阅代码段中的注释).这似乎是多余的,但我无法弄清楚如何以另一种方式做到这一点.

types go slice

63
推荐指数
2
解决办法
3万
查看次数

golang:slice of slice!=它实现的接口切片?

我有一个接口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).我缺少什么,我该如何正确实施这样的解决方案?

go

55
推荐指数
3
解决办法
3万
查看次数

如何知道Golang网络包中的TCP连接是否已关闭?

我是Golang的新手.

我正在实现一个小型TCP服务器,如何知道我的一个客户是否已关闭?我应该尝试阅读或写入并检查错误是否为零?

tcp go

48
推荐指数
3
解决办法
6万
查看次数

创建列表的Golang地图

我想创建一个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)

go

45
推荐指数
3
解决办法
7万
查看次数

在分配时解压缩Golang切片?

在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)

但那是无效的.

go

40
推荐指数
3
解决办法
3万
查看次数

标签 统计

go ×10

json ×2

slice ×2

tcp ×1

types ×1