我正在尝试在Go中启动一个HTTP服务器,它将使用我自己的处理程序提供我自己的数据,但同时我想使用默认的http FileServer来提供文件.
我遇到问题,使FileServer的处理程序在URL子目录中工作.
此代码无效:
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.Handle("/files/", http.FileServer(http.Dir(".")))
http.HandleFunc("/hello", myhandler)
err := http.ListenAndServe(":1234", nil)
if err != nil {
log.Fatal("Error listening: ", err)
}
}
func myhandler(w http.ResponseWriter, req *http.Request) {
fmt.Fprintln(w, "Hello!")
}
Run Code Online (Sandbox Code Playgroud)
我期待在localhost:1234/files /中找到本地目录,但它返回一个404 page not found.
但是,如果我将文件服务器的处理程序地址更改为/,它可以工作:
/* ... */
http.Handle("/", http.FileServer(http.Dir(".")))
Run Code Online (Sandbox Code Playgroud)
但现在我的文件可以在根目录下访问和查看.
如何使其从不同于root的URL提供文件?
我怎样才能知道字符串中子字符串的位置,用字符(或符文)代替字节?
strings.Index(s, sub) 将以字节为单位给出位置.使用Unicode时,它与符文中的位置不匹配:http://play.golang.org/p/DnlFjPaD2j
func main() {
s := "áéíóúÁÉÍÓÚ"
fmt.Println(strings.Index(s, "ÍÓ"))
}
Run Code Online (Sandbox Code Playgroud)
结果:14.预期:7
当然,我可以转换s,并sub以[]rune和寻找手动子切片,但有一个更好的方式来做到这一点?
与此相关,要获取n字符串的第一个字符,我正在这样做:string([]rune(s)[:n]).这是最好的方式吗?
我想解析一下time.Duration.持续时间是"PT15M"(字符串/字节),并希望将其转换为有效time.Duration.
如果这是一time.Time件事,我会用:
t, err := time.Parse(time.RFC3339Nano, "2013-06-05T14:10:43.678Z")
但这不存在(ParseDuration只需要一个参数):
d, err := time.ParseDuration(time.RFC3339Nano, "PT15M")
我如何解析ISO 8601持续时间?
i从切片中删除元素a,保留顺序的惯用方法似乎是:
a = append(a[:i], a[i+1:]...)
我想知道在循环中哪个是最好的方法.据我了解,不可能在以下范围内使用它:
for i := range a { // BAD
if conditionMeets(a[i]) {
a = append(a[:i], a[i+1:]...)
}
}
Run Code Online (Sandbox Code Playgroud)
但是可以使用len(a).[编辑:这不起作用,见下面的答案]
for i := 0; i < len(a); i++ {
if conditionMeets(a[i]) {
a = append(a[:i], a[i+1:]...)
}
}
Run Code Online (Sandbox Code Playgroud)
是否有比使用len或更好或更惯用的方式append?
我正在尝试使用 os.Mkdir 创建具有某些权限的目录,但由于某种原因我无法使其工作。
我的测试程序是:
package main
import (
"log"
"os"
)
func main() {
err := os.Mkdir("testdir", 0775)
if err != nil {
log.Print(err)
}
}
Run Code Online (Sandbox Code Playgroud)
但是创建的目录默认有0755权限:
drwxr-xr-x 2 user user 4096 Jan 10 10:14 testdir
Run Code Online (Sandbox Code Playgroud)
shell 中的 chmod 工作得很好,所以我不确定为什么 Go 程序不工作。
我正在玩Go以了解它的功能和语法.我已经完成了一个带有并发go函数的简单生产者 - 消费者程序,以及中间的优先缓冲区.单个生产者生成具有特定优先级的任务,并使用通道将它们发送到缓冲区.一组消费者在闲置,接收并消费它时会要求任务.中间缓冲区将一组任务存储在优先级队列缓冲区中,因此首先提供最高优先级的任务.该程序还会打印垃圾收集器活动(调用它的次数以及收集垃圾所花费的时间).
我正在使用Go 1.1在Raspberry Pi上运行它.
该软件似乎工作正常,但我发现在SO级别,htop显示有4个进程在运行,内存使用相同,CPU使用总和超过100%(Raspberry Pi只有一个核心,所以我假设它与线程/进程有关).系统负载大约是CPU的7%,我想因为OS级别的上下文切换是恒定的.GOMAXPROCS环境变量设置为1或取消设置.
你知道为什么Go使用多个操作系统进程吗?
代码可以在这里找到:http://pastebin.com/HJUq6sab
谢谢!
编辑:
它似乎htop显示了系统的轻量级过程.Go程序运行其中几个轻量级进程(它们与goroutines线程不同),因此使用htop显示多个进程,同时ps或top将只显示一个进程.
我正在努力将gzip Writer直接连接到gzip Reader,这样我就可以写入Writer并随时从Reader中读取.我期待读完我写的内容.我正在使用gzip,但是我也想使用这种方法和crypto/aes,我想它应该非常相似,它可以和其他读者/作者一起使用,比如jpeg,png ......
这是我最好的选择,这是行不通的,但我希望你能看出我的意思:http://play.golang.org/p/7qdUi9wwG7
package main
import (
"bytes"
"compress/gzip"
"fmt"
)
func main() {
s := []byte("Hello world!")
fmt.Printf("%s\n", s)
var b bytes.Buffer
gz := gzip.NewWriter(&b)
ungz, err := gzip.NewReader(&b)
fmt.Println("err: ", err)
gz.Write(s)
gz.Flush()
uncomp := make([]byte, 100)
n, err2 := ungz.Read(uncomp)
fmt.Println("err2: ", err2)
fmt.Println("n: ", n)
uncomp = uncomp[:n]
fmt.Printf("%s\n", uncomp)
}
Run Code Online (Sandbox Code Playgroud)
似乎gzip.NewReader(&b)是试图立即阅读并返回EOF.
我想知道为什么函数不能使用同类型的函数?请参阅以下伪函数.
游乐场:http://play.golang.org/p/ZG1jU8H2ZJ
package main
type typex struct {
email string
id string
}
type typey struct {
email string
id string
}
func useType(t *typex) {
// do something
}
func main() {
x := &typex{
id: "somethng",
}
useType(x) // works
y := &typey{
id: "something",
}
useType(y) // doesn't work ??
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试插入一个Int值来切片,如果它缺少那么.
我的代码:
package main
import (
"fmt"
)
func AppendIfMissing(slice []int, i int) []int {
for _, ele := range slice {
if ele == i {
fmt.Println(i)
return slice
}
}
fmt.Println("i value is ", i)
slice = append(slice, i)
return slice
}
func main() {
slice1 := []int{1, 2, 3, 4}
AppendIfMissing(slice1, 60)
fmt.Println("slice after adding :", slice1)
}
Run Code Online (Sandbox Code Playgroud)
OutPut:
i value is 60
slice after adding : [1 2 3 4]
Run Code Online (Sandbox Code Playgroud)
没有附加到切片.我的代码出了什么问题?
我正在解析一个网页以获取标签内的一些值,但我对标签不感兴趣,只对内容感兴趣.
我正在使用regexp.FindAll获取所有匹配的表达式(包括标签),然后使用ReplaceAll替换每个子表达式,删除标签.当然,运行正则表达式需要两倍的时间,我想避免它.
有没有办法同时应用这两个函数,或同等的正则表达式?
当然,我可以创建一个删除标签的功能,但在某些情况下由于可变长度标签(如)可能会更复杂,正则表达式可以解决这个问题.
我的代码的一个简单示例就在这里(它不会在操场上运行):http://play.golang.org/p/uGKjzmylSY
func main() {
res, err := http.Get("http://www.elpais.es")
if err != nil {
panic(err)
}
body, err := ioutil.ReadAll(res.Body)
fmt.Println("body: ", len(body), cap(body))
res.Body.Close()
if err != nil {
panic(err)
}
r := regexp.MustCompile("<li>(.+)</li>")
// Find all subexpressions, containing the label <li>
out := r.FindAll(body, -1)
for i, v := range out[:10] {
fmt.Printf("%d: %s\n", i, v)
}
//Replace to remove the label.
out2 := make([][]byte, len(out))
for i, v := range out …Run Code Online (Sandbox Code Playgroud) 我被要求检查 WordPress 安装,其中没有用户有权访问 wp-admin 目录,甚至管理员也无权访问。我尝试了在互联网上找到的所有解决方案,但均未成功:
我已经没有下一步要检查的选项了,非常欢迎任何建议。