我有下面的函数接受一个bool指针.我想知道是否有任何符号允许我在结构文字中设置is字段的值true; 基本上没有定义新的标识符(i.e. var x := true ; handler{is: &x} )
package main
import "fmt"
func main() {
fmt.Println("Hello, playground")
check(handler{is: new(bool) })
}
type handler struct{
is *bool
}
func check(is handler){}
Run Code Online (Sandbox Code Playgroud) 我是Go语言(Golang)的新手,我正在编写一个基于Web的应用程序.我想使用会话变量,比如PHP中的类型(从一个页面到下一个页面可用的变量,以及用户会话的唯一变量).Go中有类似的东西吗?如果没有,我将如何自己实施它们?或者有哪些替代方法?
我用谷歌搜索但没有回答.可能吗?如果是的话,该怎么办?
Go Playground链接:https://play.golang.org/
我正在编写一个从文件中读取的Go代码.为此,我使用fmt.Println()打印到该中间文件.
我怎么打印"?
我只需要一个指向time.Time的指针,所以下面的代码似乎无效:
./c.go:5:不能取时间地址.现在()
我只是想知道为什么?有没有办法做到这一点,除了先对变量赋值并获取变量的指针?
package main
import "time"
func main() {
_ = &time.Now()
}
Run Code Online (Sandbox Code Playgroud) 我发现这个问题有这个很好的答案:
我玩弄了答案并尝试以相同的方式获取结构的名称:
package main
import (
"fmt"
"reflect"
)
type Ab struct {
}
func getType(myvar interface{}) string {
return reflect.TypeOf(myvar).Name()
}
func main() {
fmt.Println("Hello, playground")
tst := "string"
tst2 := 10
tst3 := 1.2
tst4 := new(Ab)
fmt.Println(getType(tst))
fmt.Println(getType(tst2))
fmt.Println(getType(tst3))
fmt.Println(getType(tst4))
}
Run Code Online (Sandbox Code Playgroud)
去游乐场:http://play.golang.org/p/tD8mygvETH
但输出是:
Hello, playground
string
int
float64
Program exited.
Run Code Online (Sandbox Code Playgroud)
预期产出将是:
Hello, playground
string
int
float64
Ab
Program exited.
Run Code Online (Sandbox Code Playgroud)
我试着通过阅读文档来弄清楚,但没有找到相关的问题.所以,对于非常普遍的问题感到抱歉,但是:
是什么原因,reflect.TypeOf().Name()不适用于(this)struct(s)?
我是新手,我正在尝试创建一个简单的聊天服务器,客户端可以向所有连接的客户端广播消息.
在我的服务器中,我有一个goroutine(无限循环)接受连接,所有连接都由一个通道接收.
go func() {
for {
conn, _ := listener.Accept()
ch <- conn
}
}()
Run Code Online (Sandbox Code Playgroud)
然后,我为每个连接的客户端启动一个处理程序(goroutine).在处理程序内部,我尝试通过迭代通道来广播所有连接.
for c := range ch {
conn.Write(msg)
}
Run Code Online (Sandbox Code Playgroud)
但是,我不能播放因为(我认为从阅读文档)通道需要在迭代之前关闭.我不确定何时应关闭频道,因为我想继续接受新的连接,关闭频道不会让我这样做.如果有人可以帮助我,或提供更好的方式向所有连接的客户广播消息,我们将不胜感激.
我很好奇Go是否可行.我有一个有多种方法的类型.有可能有一个函数,它接受一个方法,并可以为该类型调用它?
这是我想要的一个小例子:
package main
import (
"fmt"
)
type Foo int
func (f Foo) A() {
fmt.Println("A")
}
func (f Foo) B() {
fmt.Println("B")
}
func (f Foo) C() {
fmt.Println("C")
}
func main() {
var f Foo
bar := func(foo func()) {
f.foo()
}
bar(A)
bar(B)
bar(C)
}
Run Code Online (Sandbox Code Playgroud)
Go think类型Foo有一个名为的方法foo(),而不是用传入的方法名称替换它.
我有这些类型:
type Value interface{}
type NamedValue struct {
Name string
Value Value
}
type ErrorValue struct {
NamedValue
Error error
}
Run Code Online (Sandbox Code Playgroud)
我可以使用v := NamedValue{Name: "fine", Value: 33},但我无法使用e := ErrorValue{Name: "alpha", Value: 123, Error: err}
似乎嵌入语法没问题,但使用它不起作用?
在Python中,您可以这样做:
"File {file} had error {error}".format(file=myfile, error=err)
Run Code Online (Sandbox Code Playgroud)
或这个:
"File %(file)s had error %(error)s" % {"file": myfile, "error": err}
Run Code Online (Sandbox Code Playgroud)
在Go中,最简单的选项是:
fmt.Sprintf("File %s had error %s", myfile, err)
Run Code Online (Sandbox Code Playgroud)
这不允许你交换格式字符串中的参数顺序,你需要为I18N做.Go 确实有这个template包,需要这样的东西:
package main
import (
"bytes"
"text/template"
"os"
)
func main() {
type Params struct {
File string
Error string
}
var msg bytes.Buffer
params := &Params{
File: "abc",
Error: "def",
}
tmpl, _ := template.New("errmsg").Parse("File {{.File}} has error {{.Error}}")
tmpl.Execute(&msg, params)
msg.WriteTo(os.Stdout)
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个很长的路要走错误信息.是否有更合理的选项允许我提供独立于订单的字符串参数?