голанг: путь через платформу.Dir


Я хотел бы использовать path.Dir() в Unix и Windows с определенным каталогом платформы. Пожалуйста, взгляните на код:

package main

import (
    "fmt"
    "path"
)

func main() {
    fmt.Println(`path.Dir("a/b/c"): `, path.Dir("a/b/c"))
    fmt.Println(`path.Dir("c:foobar.exe"): `, path.Dir(`c:foobar.exe`))
}

Это выводит

path.Dir("a/b/c"):  a/b
path.Dir("c:foobar.exe"):  .

Я хотел бы получить для второго вызова path.Dir() (windows) что-то вроде

c:foo

Можно ли сказать path.dir(), чтобы использовать разделители Windows для моей программы, работающей на windows? Или я всегда должен преобразовывать обратную косую черту в прямую косую черту (/)? Какова здесь предпочтительная стратегия?

1 8

1 ответ:

Я вижу, где находится "проблема". эта дискуссия в golang-nuts дала мне подсказку, что path.Dir() всегда использует / и filepath.Dir() является функцией, которая будет использоваться для зависимых от платформы манипуляций.

package main

import (
    "fmt"
    "path/filepath"
)

func main() {
    fmt.Println(`filepath.Dir("a/b/c"): `, filepath.Dir("a/b/c"))
    fmt.Println(`filepath.Dir("c:\foo\bar.exe"): `, filepath.Dir(`c:\foo\bar.exe`))
}

В windows:

filepath.Dir("a/b/c"):  a\b
filepath.Dir("c:\foo\bar.exe"):  c:\foo