41

Is there an API method like Node's path.resolve? Or something else that can achieve the same result?

For example, this NodeJS code:

path.resolve("~/sample.sh")

Should output:

/home/currentuser/sample.sh
2
  • 1
    This technically isn't relative to absolute, it's tilde expansion. ~/sample.sh is an absolute path (what it refers to does not change based on CWD). The tilde is just a shortcut for the user's (absolute) home directory path. Commented Nov 13, 2017 at 14:40
  • Possible duplicate of Expand tilde to home directory Commented Nov 13, 2017 at 14:40

1 Answer 1

50

Resolving ~ (denoting the user home) is a different story, and usually it's the shell that resolves this. For details see Expand tilde to home directory.

If you want to do it from Go code, you may use the user.Current() function to get details about the current user, including its home folder which will be User.HomeDir. But still, you'll have to handle replacing this yourself.

Original answer follows.


You may use path.Join() or filepath.Join().

For example:

base := "/home/bob"
fmt.Println(path.Join(base, "work/go", "src/github.com"))

Output:

/home/bob/work/go/src/github.com

You may use path.Clean() and filepath.Clean() to "remove" dots . and double dots .. from your path.

You may use filepath.Abs() to resolve relative paths and get an absolute (prepending the working directory if it's not absolute). filepath.Abs() also calls Clean() on the result.

For example:

fmt.Println(filepath.Abs("/home/bob/../alice"))

Outputs:

/home/alice <nil>

Try the examples on the Go Playground.

See related question: Resolving absolute path from relative path

Sign up to request clarification or add additional context in comments.

4 Comments

This seems like a red herring - Join doesn't have anything to do with the question that was asked, nor does Clean. It's not until the last 3 paragraphs or that the question is addressed.
@Adrian The first version of the question didn't mention resolving ~, just resolving paths. But yes, they are not relevant anymore.
Ah, fair enough, didn't see that it had been edited.
@Adrian Edited the answer to make it obvious.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.