小编ANi*_*sus的帖子

Go中使用JSON Marshal的小写JSON密钥名称

我希望使用该"encoding/json"包来封送在我的应用程序的一个导入包中声明的结构.

例如.:

type T struct {
    Foo int
}
Run Code Online (Sandbox Code Playgroud)

因为它是导入的,所以结构中的所有可用(导出)字段都以大写字母开头.但我希望有小写的密钥名称:

out, err := json.Marshal(&T{Foo: 42})
Run Code Online (Sandbox Code Playgroud)

会导致

{ "富":42}

但我希望得到

{ "foo" 的:42}

是否有可能以一种简单的方式解决问题?

json marshalling go

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

部分JSON解组到Go中的地图中

我的websocket服务器将接收和解组JSON数据.此数据将始终包含在具有键/值对的对象中.密钥字符串将充当值标识符,告诉Go服务器它是什么类型的值.通过知道什么类型的值,我可以继续JSON将值解组为正确的结构类型.

每个json对象可能包含多个键/值对.

示例JSON:

{
    "sendMsg":{"user":"ANisus","msg":"Trying to send a message"},
    "say":"Hello"
}
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法使用"encoding/json"包来做到这一点?

package main

import (
    "encoding/json"
    "fmt"
)

// the struct for the value of a "sendMsg"-command
type sendMsg struct {
    user string
    msg  string
}
// The type for the value of a "say"-command
type say string

func main(){
    data := []byte(`{"sendMsg":{"user":"ANisus","msg":"Trying to send a message"},"say":"Hello"}`)

    // This won't work because json.MapObject([]byte) doesn't exist
    objmap, err := json.MapObject(data)

    // This is what I wish the objmap …
Run Code Online (Sandbox Code Playgroud)

json map go

87
推荐指数
2
解决办法
8万
查看次数

在Go中对多个返回值进行转换/类型断言的惯用方法

在Go中转换多个返回值的惯用方法是什么?

你可以在一行中完成它,还是需要使用临时变量,例如我在下面的例子中做过的?

package main

import "fmt"

func oneRet() interface{} {
    return "Hello"
}

func twoRet() (interface{}, error) {
    return "Hejsan", nil
}

func main() {
    // With one return value, you can simply do this
    str1 := oneRet().(string)
    fmt.Println("String 1: " + str1)

    // It is not as easy with two return values
    //str2, err := twoRet().(string) // Not possible
    // Do I really have to use a temp variable instead?
    temp, err := twoRet()
    str2 := temp.(string)
    fmt.Println("String 2: …
Run Code Online (Sandbox Code Playgroud)

casting return-value go

73
推荐指数
4
解决办法
8万
查看次数

Go select语句的优先级解决方法

我希望在两个通道上进行常规监听,当两个通道都耗尽时阻塞.但是,如果两个通道都包含数据,我希望在处理另一个通道之前将其耗尽.

在下面的工作示例中,我希望outexit处理之前将所有内容都耗尽.我使用select没有任何优先顺序的-statement.我如何解决问题,在退出之前处理所有10个输出值?

package main

import "fmt"

func sender(out chan int, exit chan bool){
    for i := 1; i <= 10; i++ {
        out <- i
    } 
    exit <- true
}

func main(){
    out := make(chan int, 10)
    exit := make(chan bool)

    go sender(out, exit)

    L:
    for {
        select {
            case i := <-out:
                fmt.Printf("Value: %d\n", i)
            case <-exit:
                fmt.Println("Exiting")
                break L
        }
    }
    fmt.Println("Did we get all 10? Most likely not")
}
Run Code Online (Sandbox Code Playgroud)

concurrency select channel go

31
推荐指数
4
解决办法
1万
查看次数

在Go模板中,访问范围内的父/全局管道

是否可以{{range pipeline}} T1 {{end}}text/template包中的操作中访问范围操作之前的管道值,或者将父/全局管道作为参数传递给Execute?

显示我尝试做的工作示例:

package main

import (
    "os"
    "text/template"
)

// .Path won't be accessible, because dot will be changed to the Files element
const page = `{{range .Files}}<script src="{{html .Path}}/js/{{html .}}"></script>{{end}}`

type scriptFiles struct {
    Path string
    Files []string
}

func main() {
    t := template.New("page")
    t = template.Must(t.Parse(page))

    t.Execute(os.Stdout, &scriptFiles{"/var/www", []string{"go.js", "lang.js"}})
}
Run Code Online (Sandbox Code Playgroud)

play.golang.org

go go-templates

25
推荐指数
1
解决办法
9377
查看次数

编组json.RawMessage返回base64编码的字符串

我运行以下代码:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := json.RawMessage(`{"foo":"bar"}`)
    j, err := json.Marshal(raw)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))  
}
Run Code Online (Sandbox Code Playgroud)

游乐场: http ://play.golang.org/p/qbkEIZRTPQ

输出:

"eyJmb28iOiJiYXIifQ=="
Run Code Online (Sandbox Code Playgroud)

期望的输出:

{"foo":"bar"}
Run Code Online (Sandbox Code Playgroud)

为什么它base64编码我RawMessage好像是普通的[]byte

毕竟,RawMessage的MarshalJSON实现只是返回字节切片

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawMessage) MarshalJSON() ([]byte, error) {
    return *m, nil 
}
Run Code Online (Sandbox Code Playgroud)

json go

22
推荐指数
1
解决办法
2万
查看次数

在Go中引用字符串文字

在我的应用程序中,我将经常传递对静态字符串的引用.我希望避免Go为每次调用分配内存,但是我没有将地址输入到我的字符串文字中.

为什么不能获取字符串文字的地址(参见test1()下面的例子)?我是否误解了语法,或者由于Go的内部工作原因这是一个限制?

如果不可能,最好的解决方案是什么?

test2()有效,但var hej每次都会分配内存吗?
test3()不会分配任何新的内存,但我希望避免功能之外的混乱.

package main

import "fmt"

var konnichiwa = `???????`

// Gives the compile error `cannot take the address of "Hello world"`
func test1() (*string) { return &`Hello world` }

// Works fine
func test2() (*string) {
    hej := `Hej världen`
    return &hej
}

func test3() (*string) { return &konnichiwa }

func main(){
    fmt.Println(*test1())
    fmt.Println(*test2())
    fmt.Println(*test3())
}
Run Code Online (Sandbox Code Playgroud)

感谢帮助!

string pointers go string-literals

16
推荐指数
4
解决办法
7419
查看次数

在Go中使用函数类型

我想创建某种类型的函数.我找到了一种方法,但必须有其他更清洁,更好的方法,不包括使用var.声明english类型函数的替代方法有哪些Greeting

package main

import "fmt"

type Greeting func(name string) string

func (g Greeting) exclamation(name string) string {
    return g(name) + "!"
}

var english = Greeting(func(name string) string {
    return "Hello, " + name
})

func main() {
    fmt.Println(english("ANisus"))
    fmt.Println(english.exclamation("ANisus"))  
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我不能交换var english = Greeting...使用english := Greeting...,我也不能删除Greeting(func ...),只是有func独立从那时起,我将无法访问感叹方法.

types function go

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

ES6承诺返回值的执行顺序

为了理解ES6 promise的执行顺序,我注意到链接处理程序的执行顺序受前一个处理程序是返回值还是promise的影响.

let a = Promise.resolve();
a.then(v => Promise.resolve("A")).then(v => console.log(v));
a.then(v => "B").then(v => console.log(v));
Run Code Online (Sandbox Code Playgroud)

直接在Chrome(v 61)控制台中运行时的输出:

B
A.

但是,当点击Run code snippet按钮时,我会收到订单A B.

是否在ES6中为上述示例定义了执行顺序,还是由实现决定?

如果定义了,那么正确的输出应该是什么?

javascript ecmascript-6 es6-promise

9
推荐指数
1
解决办法
471
查看次数

通过Websocket发送WebRTC MediaStream(通过HTTP/Websocket进行RTP)

除其他外,WebRTC用于实时浏览器到浏览器媒体通信,但在我的情况下,它将用于浏览器到服务器的音频通信.

根据我收集的信息,使用RTP over UDP传输MediaStream.

除了用于信令的协议之外,这将需要至少两个额外的端口,这是我想要避免的.

在WebRTC中,是否有可能在Websocket上使用RTP而不是在UDP上使用RTP,这样我只需要使用端口80或443?

rtp websocket webrtc

8
推荐指数
1
解决办法
1万
查看次数