我希望使用该"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}
是否有可能以一种简单的方式解决问题?
我的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) 在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) 我希望在两个通道上进行常规监听,当两个通道都耗尽时阻塞.但是,如果两个通道都包含数据,我希望在处理另一个通道之前将其耗尽.
在下面的工作示例中,我希望out在exit处理之前将所有内容都耗尽.我使用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) 是否可以{{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)
我运行以下代码:
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) 在我的应用程序中,我将经常传递对静态字符串的引用.我希望避免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)
感谢帮助!
我想创建某种类型的函数.我找到了一种方法,但必须有其他更清洁,更好的方法,不包括使用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独立从那时起,我将无法访问感叹方法.
为了理解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中为上述示例定义了执行顺序,还是由实现决定?
如果定义了,那么正确的输出应该是什么?
除其他外,WebRTC用于实时浏览器到浏览器媒体通信,但在我的情况下,它将用于浏览器到服务器的音频通信.
根据我收集的信息,使用RTP over UDP传输MediaStream.
除了用于信令的协议之外,这将需要至少两个额外的端口,这是我想要避免的.
在WebRTC中,是否有可能在Websocket上使用RTP而不是在UDP上使用RTP,这样我只需要使用端口80或443?
go ×8
json ×3
casting ×1
channel ×1
concurrency ×1
ecmascript-6 ×1
es6-promise ×1
function ×1
go-templates ×1
javascript ×1
map ×1
marshalling ×1
pointers ×1
return-value ×1
rtp ×1
select ×1
string ×1
types ×1
webrtc ×1
websocket ×1