208

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?

4
  • I didn't set a GOPATH variable, only GOROOT. Commented Feb 24, 2013 at 8:21
  • 1
    run go install under the directory of mylib first, and try again. Commented Feb 24, 2013 at 9:06
  • 1
    See also this thread. Commented Feb 24, 2013 at 11:14
  • @Joe, it still can't work by running "go install" inside Commented Feb 14, 2020 at 3:20

10 Answers 10

191

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:

  1. Place the directory with library files under the directory of your project.
  2. 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.

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

9 Comments

If I create a new project (myproject2) under src/, how could I import mylib?
@Kiril, you mean, how do you import mylib in the code of myproject2? Then the answer is "by using import "myproject/mylib" -- the idea is that Go searches for imported paths under each directory it extracts from the GOPATH environment variable (they are called "workspaces"), but this search is (luckily) not recursive, so such paths are effectively "anchored" at their respective workspaces.
Another must-have read: "Package names".
@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 (and go mod supports vendoring of modules as well).
@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.
|
79

For this kind of folder structure:

main.go mylib/ mylib.go 

The simplest way is to use this:

import ( "./mylib" ) 

5 Comments

This 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 is foo).
@nemo, with the latest version of go, I always use "./mylib" and it works.
Using go 1.2 and I agree with @this.lau_
Be aware that this makes go install break. If you're building a standalone project that you want people to download and run go build on, this is fine--however, I would employ the "Github code layout" mentioned above (even if off bitbucket, or similar) if you want full go install support.
I suggestionDo not use this way. It's will breaking godef. godef it does not understand about "." imports
9

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 !

Comments

6

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" ... 

Comments

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

Comments

2

another solution:
add src/myproject to $GOPATH.

Then import "mylib" will compile.

1 Comment

this will not work for go gettable paths such as github hosted packages.
1

finally I found the solution for this problem. Please note I have a very basic coding environment, also using basic stuff as I am a beginner at the moment. I wanted to use my library in the very same way as I use official libraries. I didn't have to edit GOPATH or any other system variables or paths, no need to rebuild or install anything. So here is my solution from top-down:

  1. In my main package I have my code as follows:
 package main import ( "mylib" // This is my library!! "fmt" ) func main() { ... mylib.myFunc(par) mylib.myOtherFunc(par1,par2) ... } 
  1. You have to use the very same package name in the package implementation files. My own package looks like as follows:
package mylib import ( "math" "strconv" "strings" ) func myFunc(par int) { ... } func myOtherFunc(par1 string, par2 int) { ... } 
  1. What you have to keep in mind to name and place correctly all the stuff:
  • Create a subfolder with the package name next to the other packages. You can find them easily by searchin eg. 'bufio', 'os' or 'math' (on my machine they are under \Go\src). In my case it looks like this:

     C: /Go /src /bufio /io /... /mylib /... /strings 
  • Move your package file into this folder. The folder name is important, this has to be the same as the package name, this is how your compiler finds it

  • You can have one ore more .go files here, they needn't to be named mylib.go, you can use any names, eg. myMath.go, myString.go, etc.

  • I repeat: the package name in all the .go files has to be your library name ('mylib' in my case)

  1. This way later on you can extend your own library by new functions, they can be implemented in separate .go files, the only important is you have to store this file in subfolder named 'mylib' and the package name has to be the same.

I hope it helps, best regards,

LA

Comments

0

For those who face this problem, you need to first initialize the go module before you can use custom package.

For example your code directory is: ../mycode/main.go. Now you want to create diffcode custom package and import it into main. You will first need to run the command go mod init mycode (make sure you are under ../mycode directory). Now you create package diffcode and it has some files. To import this package, you need to put this into main.go: module/package. In this case, mycode/diffcode.

Comments

0

The essential question here is to tailor the idea of compiling the package as library binary, and then import the binary code as third party library like "net/http" or "fmt" in some new go project, instead using the original go code. I am wondering if this is possible or not for go programming.

2 Comments

As 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.
This 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
0

I recently started learning GO Lang and faced the same issue. It happens because many confuse themselves between module, package and file.

However, when I started the project, what I did was

go mod init <moduleName>

go mod init hello01 

or you can always look for the module name in go.mod file. mine looked like

module hello01 go 1.24.1 

and my package was in the relative folder, i.e., ./testPackage/test.go

which looked like

package test import "fmt" func MuFunc() { //Some Code Inside fmt.Println("Blah Blah Blah") } 

and my directory Looked Like somewhat

/project1 /testPackage test.go main.go go.mod 

So, I'll use my /testPackage for keeping my package, and main.go to implement those packages.

The main.go file looks like

package main import test "hello01/testPackage" func main() { test.MuFunc() } 

since my module name is hello01 and the package is in directory /testPackage, and because the name of the file is test.go I'm using function as test.Mufunc()

I hope this will help new commers. Exprienced Ones please rectify if any mistake was commited by me.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.