我正在尝试在Google应用引擎上使用Go而不是Python来构建我的网站。但是当我本地测试脚本时,一直出现以下错误。
panic: runtime error: invalid memory address or nil pointer dereference
我很困惑,但是如果我注释掉它,它将不会出错。
channel <- buffer[0:dat]
我一定是在错误使用通道,有什么帮助吗?
编辑:
这是可行的代码,非常感谢Kevin Ballard帮助我解决了这个问题。
package defp
import (
"fmt"
"http"
"os"
)
func getContent(filename string, channel chan []byte) {
file, err := os.OpenFile(filename, os.O_RDONLY, 0666)
defer file.Close()
if err == nil {
fmt.Printf("FILE FOUND : " + filename + " \n")
buffer := make([]byte, 16)
dat, err := file.Read(buffer)
for err == nil {
fmt.Printf("herp")
channel <- buffer[0:dat]
buffer = make([]byte, 16)
dat, err = file.Read(buffer)
}
close(channel)
fmt.Printf("DONE READING\n")
} else {
fmt.Printf("FILE NOT FOUND : " + filename + " \n")
}
}
func writeContent(w http.ResponseWriter, channel chan []byte) {
fmt.Printf("ATTEMPTING TO WRITE CONTENT\n")
go func() {
for bytes := range channel {
w.Write(bytes)
fmt.Printf("BYTES RECEIVED\n")
}
}()
fmt.Printf("FINISHED WRITING\n")
}
func load(w http.ResponseWriter, path string) {
fmt.Printf("ATTEMPTING LOAD " + path + "\n")
channel := make(chan []byte, 50)
writeContent(w, channel)
getContent(path, channel)
}
func handle(w http.ResponseWriter, r *http.Request) {
fmt.Printf("HANDLING REQUEST FOR " + r.URL.Path[1:] + "\n")
load(w, r.URL.Path[1:])
}
func init() {
http.HandleFunc("/", handle)
}
fmt.Fprint(w, bytes)
改成w.Write(bytes)
。前者将字节数组作为整数序列写入,而后者直接将其作为字节写入。 - Lily Ballardgo func()
。你还需要在打印“DONE READING”的地方调用close()
方法,否则读取循环将永远无法终止。 - Lily Ballard