Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

importing go files in same folder

Tags:

import

path

go

I am having difficulty in importing a local go file into another go file.

My project structure is like something below

-samplego --pkg --src ---github.com ----xxxx -----a.go -----b.go --bin 

I am trying to import a.go inside b.go. I tried the following,

import "a" import "github.com/xxxx/a" 

None of these worked..I understand I have to meddle up with GOPATH but I couldn't get it right. Presently my GOPATH is pointing to samplego(/workspace/samplego).I get the below error

cannot find package "a" in any of: /usr/local/go/src/pkg/a (from $GOROOT) /workspace/samplego/src/a (from $GOPATH) 

Also, how does GOPATH work when these source files are imported into another project/module? Would the local imports be an issue then? What is the best practice in this case - is it to have just one go file in module(with associated tests)?

like image 819
g0c00l.g33k Avatar asked Nov 15 '14 03:11

g0c00l.g33k


People also ask

How do I import a file into a folder in Golang?

Create a file basic.go inside the basic folder. The file inside the basic folder should start with the line package basic as it belongs to the basic package. Create a file gross.go inside the gross folder. The file inside the gross folder should start with the line package gross as it belongs to the gross package.

How can you tell Go to import a package from a different location?

Go first searches for package directory inside GOROOT/src directory and if it doesn't find the package, then it looks for GOPATH/src . Since, fmt package is part of Go's standard library which is located in GOROOT/src , it is imported from there.

How do I import packages to Go?

In Go, code executed as an application must be in a main package. Import two packages: example.com/greetings and the fmt package. This gives your code access to functions in those packages. Importing example.com/greetings (the package contained in the module you created earlier) gives you access to the Hello function.


1 Answers

Any number of files in a directory are a single package; symbols declared in one file are available to the others without any imports or qualifiers. All of the files do need the same package foo declaration at the top (or you'll get an error from go build).

You do need GOPATH set to the directory where your pkg, src, and bin directories reside. This is just a matter of preference, but it's common to have a single workspace for all your apps (sometimes $HOME), not one per app.

Normally a Github path would be github.com/username/reponame (not just github.com/xxxx). So if you want to have main and another package, you may end up doing something under workspace/src like

github.com/   username/     reponame/       main.go   // package main, importing "github.com/username/reponame/b"       b/         b.go    // package b 

Note you always import with the full github.com/... path: relative imports aren't allowed in a workspace. If you get tired of typing paths, use goimports. If you were getting by with go run, it's time to switch to go build: run deals poorly with multiple-file mains and I didn't bother to test but heard (from Dave Cheney here) go run doesn't rebuild dirty dependencies.

Sounds like you've at least tried to set GOPATH to the right thing, so if you're still stuck, maybe include exactly how you set the environment variable (the command, etc.) and what command you ran and what error happened. Here are instructions on how to set it (and make the setting persistent) under Linux/UNIX and here is the Go team's advice on workspace setup. Maybe neither helps, but take a look and at least point to which part confuses you if you're confused.

like image 85
twotwotwo Avatar answered Sep 19 '22 08:09

twotwotwo