Golang中国

如题:

http.HandleFunc("/login", login)

浏览器中访问的时候就报错了,然后通过

wd,err := os.Getwd()

得知这里的路径是 ~ 也就是用户的根目录
于是在 HandleFunc 中,就只好使用绝对路径了,请问为什么会出现这种问题呢?


Nixus 于 2016-07-15 17:54 修改
2 回复
xinyu391
#1 xinyu391 • 2016-07-20 08:45

是当前目录吧
就是编译好的程序所在的目录

rockman
#2 rockman • 2016-07-21 11:38

如果访问的是静态资源,那么是应该使用绝对路径

  1. 先得到go程序运行所在的绝对路径
  2. 拼接资源的相对路径,得到资源的绝对路径

Get Current Executable Directory in golang

os.Getwd() will NOT return current executable dir.

  • Getwd returns a rooted path name corresponding to the current directory(See https://godoc.org/os#Getwd).
  • It’s similar to pwd command.
  • Example Code

      package main
    
      import (
              "fmt"
              "os"
      )
    
      func main() {
              dir, _ := os.Getwd()
              fmt.Printf("os.Getwd(): %v\n", dir)
      }
    
  • Test

    • Run the program under the same dir as go project

      • cd /home/xx/projects-go/src/github.com/northbright/getwd-test
      • ./getwd-test
      • the result is: os.Getwd(): /home/xx/projects-go/src/github.com/northbright/getwd-test
    • Run the program under user home

      • cd /home/xx
      • ./projects-go/src/github.com/northbright/getwd-test/getwd-test
      • the result is: os.Getwd(): /home/xx

Solution

import (
    "fmt"
    "os"
    "os/exec"
    "path/filepath"
)

func GetCurrentExecDir() (dir string, err error) {
    path, err := exec.LookPath(os.Args[0])
    if err != nil {
        fmt.Printf("exec.LookPath(%s), err: %s\n", os.Args[0], err)
        return "", err
    }

    absPath, err := filepath.Abs(path)
    if err != nil {
        fmt.Printf("filepath.Abs(%s), err: %s\n", path, err)
        return "", err
    }

    dir = filepath.Dir(absPath)

    return dir, nil
}

References

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。