How to use custom packages
Solution 1
First, be sure to read and understand the "How to write Go code" document.
The actual answer depends on the nature of your "custom package".
If it's intended to be of general use, consider employing the so-called "Github code layout". Basically, you make your library a separate go get
-table project.
If your library is for internal use, you could go like this:
- Place the directory with library files under the directory of your project.
- In the rest of your project, refer to the library using its path relative to the root of your workspace containing the project.
To demonstrate:
src/
myproject/
mylib/
mylib.go
...
main.go
Now, in the top-level main.go
, you could import "myproject/mylib"
and it would work OK.
Solution 2
For this kind of folder structure:
main.go
mylib/
mylib.go
The simplest way is to use this:
import (
"./mylib"
)
Solution 3
I am an experienced programmer, but, quite new into Go world ! And I confess I've faced few difficulties to understand Go... I faced this same problem when trying to organize my go files in sub-folders. The way I did it :
GO_Directory ( the one assigned to $GOPATH )
GO_Directory //the one assigned to $GOPATH
__MyProject
_____ main.go
_____ Entites
_____ Fiboo // in my case, fiboo is a database name
_________ Client.go // in my case, Client is a table name
On File MyProject\Entities\Fiboo\Client.go
package Fiboo
type Client struct{
ID int
name string
}
on file MyProject\main.go
package main
import(
Fiboo "./Entity/Fiboo"
)
var TableClient Fiboo.Client
func main(){
TableClient.ID = 1
TableClient.name = 'Hugo'
// do your things here
}
( I am running Go 1.9 on Ubuntu 16.04 )
And remember guys, I am newbie on Go. If what I am doing is bad practice, let me know !
Solution 4
For a project hosted on GitHub, here's what people usually do:
github.com/
laike9m/
myproject/
mylib/
mylib.go
...
main.go
mylib.go
package mylib
...
main.go
import "github.com/laike9m/myproject/mylib"
...
Solution 5
I try so many ways but the best I use go.mod and put
module nameofProject.com
and then i import from same project I use
import("nameofProject.com/folder")
It's very useful to create project in any place
Related videos on Youtube
laurent
Updated on July 08, 2022Comments
-
laurent almost 2 years
I'm trying to create and use a custom package in Go. It's probably something very obvious but I cannot find much information about this. Basically, I have these two files in the same folder:
mylib.go
package mylib type SomeType struct { }
main.go
package main import ( "mylib" ) func main() { }
When I try to
go run main.go
, I get this error:main.go:4:2: import "mylib": cannot find package
I've tried to run
go build mylib.go
first but it doesn't seem to be doing anything (no file generated, no error message). So any idea how I could do this?-
laurent about 11 yearsI didn't set a GOPATH variable, only GOROOT.
-
Joe about 11 yearsrun
go install
under the directory ofmylib
first, and try again. -
kostix about 11 yearsSee also this thread.
-
hunter_tech about 4 years@Joe, it still can't work by running "go install" inside
-
-
nemo over 10 yearsThis does not work anymore in recent versions of go as the package will not be found. The correct import would be
foo/mylib
(assuming the folder containing main.go isfoo
). -
laurent over 10 years@nemo, with the latest version of go, I always use "./mylib" and it works.
-
canadadry about 10 yearsUsing go 1.2 and I agree with @this.lau_
-
photoionized about 10 yearsBe aware that this makes
go install
break. If you're building a standalone project that you want people to download and rungo build
on, this is fine--however, I would employ the "Github code layout" mentioned above (even if off bitbucket, or similar) if you want fullgo install
support. -
Kiril about 10 yearsIf I create a new project (myproject2) under src/, how could I import mylib?
-
kostix about 10 years@Kiril, you mean, how do you import
mylib
in the code ofmyproject2
? Then the answer is "by usingimport "myproject/mylib"
-- the idea is that Go searches for imported paths under each directory it extracts from theGOPATH
environment variable (they are called "workspaces"), but this search is (luckily) not recursive, so such paths are effectively "anchored" at their respective workspaces. -
kostix over 8 yearsAnother must-have read: "Package names".
-
Gustav almost 8 yearsthis will not work for go gettable paths such as github hosted packages.
-
King Jk about 7 yearsI suggestionDo not use this way. It's will breaking godef. godef it does not understand about "." imports
-
cmcginty over 6 yearsThis answer is ambiguous in that there are two
mylib
items listed and it's not clear if this is a requirement or just a simplification of the example. If you could clarify in the answer it would be more useful. -
Matthias Sommer almost 5 yearsI have several microservices which all depend on the same mylib. If I change mylib, I would have to change it in all services. How would you handle this?
-
kostix almost 5 years@MatthiasSommer, typically—by extracting that mylib into a common package each microservice uses. Exactly how "uses" is defined, depends on your preferred workflow. In enterprise-grade development, vendoring is typically used, but with the recent
go mod
developments, a module might be the answer (andgo mod
supports vendoring of modules as well). -
Lei Yang over 4 yearsso the package to be imported can only be .go file? how to build package to .lib file then import the lib file?
-
kostix over 4 years@LeiYang, "the package to be imported" is a directory with one or more Go source files. As to "how to build package to a .lib file" and then import the lib file"—the answer depends on what you really intended to ask for. If you're concerned with compilation speed, then fear not: the Go toolchain caches all build results on a per-package basis. If, instead, you wanted to ask whether it's possible to compile and distribute a binary-only compiled package, then the answer is no.
-
kostix over 4 years@LeiYang, but note that if for some reason you still desperately need something like this, on some platforms Go supports plugins.
-
Admin over 2 yearsAs it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.
-
Subhashis Pandey over 2 yearsThis does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review