在Golang中,如何在根目录中提供静态内容,同时还有用于提供主页的根目录处理程序。 以下面简单的Web服务器为例: package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", HomeHandler) // homepage http.ListenAndServe(":8080", nil) } func HomeHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "HomeHandler") } 如果我做 http.Handle("/", http.FileServer(http.Dir("./"))) 我收到一个恐慌,说我有两个“/”的注册。 我在互联网上find的每个Golang示例都build议从不同目录中提供静态内容,但对于sitemap.xml,favicon.ico,robots.txt和其他文件被授权始终从根开始服务。 我所寻找的行为是在大多数Web服务器(如Apache,Nginx或IIS)中find的行为,它首先遍历规则,如果找不到规则,则查找实际文件,如果找不到文件404。 我的猜测是,而不是编写一个http.HandlerFunc ,我需要编写一个http.Handler ,检查是否引用一个扩展名的文件,如果是的话,检查文件的存在和服务的文件,否则404或服务主页是请求为“/”。 不幸的是,我不确定如何开始这样的任务。 我的一部分说,我大大过度复杂的情况,使我觉得我失去了一些东西? 任何指导将不胜感激。
你如何在Go中expression一个“空”值? type Node struct { next *Node data interface{} } 我想说 return &Node{ data: NULL, next: NULL }
我不知道是否可以在Go中为未知数量的variables定义一个函数。 像这样的东西 func Add(num1… int) int { return args } func main() { fmt.Println("Hello, playground") fmt.Println(Add(1, 3, 4, 5,)) } 我想概括任何数量的input添加function。
在创build这样的结构之后: type Foo struct { name string } func (f Foo) SetName(name string){ f.name=name } func (f Foo) GetName string (){ return f.name } 如何创buildFoo的新实例并设置名称? 我尝试了以下内容: p:=new(Foo) p.SetName("Abc") name:=p.GetName() fmt.Println(name) 没有打印,因为名字是空的。 那么如何在结构中设置和获取字段呢?
运行我的Go程序时,它会发生混乱并返回以下内容: panic: runtime error: invalid memory address or nil pointer dereference [signal 0xb code=0x1 addr=0x38 pc=0x26df] goroutine 1 [running]: main.getBody(0x1cdcd4, 0xf800000004, 0x1f2b44, 0x23, 0xf84005c800, …) /Users/matt/Dropbox/code/go/scripts/cron/fido.go:65 +0x2bb main.getToken(0xf84005c7e0, 0x10) /Users/matt/Dropbox/code/go/scripts/cron/fido.go:140 +0x156 main.main() /Users/matt/Dropbox/code/go/scripts/cron/fido.go:178 +0x61 goroutine 2 [syscall]: created by runtime.main /usr/local/Cellar/go/1.0.3/src/pkg/runtime/proc.c:221 goroutine 3 [syscall]: syscall.Syscall6() /usr/local/Cellar/go/1.0.3/src/pkg/syscall/asm_darwin_amd64.s:38 +0x5 syscall.kevent(0x6, 0x0, 0x0, 0xf840085188, 0xa, …) /usr/local/Cellar/go/1.0.3/src/pkg/syscall/zsyscall_darwin_amd64.go:199 +0x88 […]
我在Go中看到了几个不同的testing包命名策略,想知道每个策略的优缺点,以及我应该使用哪一个。 策略1: 文件名:github.com/user/myfunc.go package myfunc testing文件名称:github.com/user/myfunc_test.go package myfunc 参见bzip2的例子。 策略2: 文件名:github.com/user/myfunc.go package myfunc testing文件名称:github.com/user/myfunc_test.go package myfunc_test import ( "github.com/user/myfunc" ) 看到一个例子的电线 。 策略3: 文件名:github.com/user/myfunc.go package myfunc testing文件名称:github.com/user/myfunc_test.go package myfunc_test import ( . "myfunc" ) 看一个例子的string 。 Go标准库似乎使用了策略1和2的混合。我应该使用哪三个? 这是一个痛苦追加package *_test到我的testing包,因为这意味着我不能testing我的包私有方法,但也许有隐藏的优势,我不知道?
在我的项目中,我有一个来自请求响应的字节数组。 defer resp.Body.Close() if resp.StatusCode != http.StatusOK { log.Println("StatusCode为" + strconv.Itoa(resp.StatusCode)) return } respByte, err := ioutil.ReadAll(resp.Body) if err != nil { log.Println("fail to read response data") return } 这工作,但如果我想获得响应的身体io.read ,我该如何转换? 我尝试了新的读者/作家,但没有成功。
有没有办法来终止在Golang中使用os.exec启动的进程? 例如(来自http://golang.org/pkg/os/exec/#example_Cmd_Start ), cmd := exec.Command("sleep", "5") err := cmd.Start() if err != nil { log.Fatal(err) } log.Printf("Waiting for command to finish…") err = cmd.Wait() log.Printf("Command finished with error: %v", err) 有没有办法提前终止这个过程,也许3秒后呢? 提前致谢
我有Java背景,我喜欢用QUIT来检查Java线程转储。 如何让Golang打印出所有的goroutines堆栈跟踪?
如果我有一张地图,那么有一个更好的方法来得到一个值的切片 package main import ( "fmt" ) func main() { m := make(map[int]string) m[1] = "a" m[2] = "b" m[3] = "c" m[4] = "d" // Can this be done better? v := make([]string, len(m), len(m)) idx := 0 for _, value := range m { v[idx] = value idx++ } fmt.Println(v) } 有一个地图的内置function吗? Go包里有一个函数吗?或者这是我必须做的最好的代码?