我正在尝试在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 目录,甚至管理员也无权访问。我尝试了在互联网上找到的所有解决方案,但均未成功:
我已经没有下一步要检查的选项了,非常欢迎任何建议。