By laurent


2013-02-24 08:15:47 8 Comments

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?

5 comments

@Diego Favero 2017-12-24 18:11:44

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 !

@laike9m 2017-07-06 15:08:56

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"

...

@kostix 2013-02-24 11:14:18

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.

@Kiril 2014-04-14 13:04:23

If I create a new project (myproject2) under src/, how could I import mylib?

@kostix 2014-04-14 17:00:18

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

@kostix 2015-12-06 10:02:27

Another must-have read: "Package names".

@cmcginty 2017-08-29 02:58:41

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

@MatthiasSommer 2019-05-15 12:50:58

I 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 2019-05-15 15:33:06

@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).

@laurent 2013-08-13 05:27:37

For this kind of folder structure:

main.go
mylib/
  mylib.go

The simplest way is to use this:

import (
    "./mylib"
)

@nemo 2013-08-27 00:51:12

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

@laurent 2013-08-27 03:49:19

@nemo, with the latest version of go, I always use "./mylib" and it works.

@canadadry 2014-03-17 20:30:32

Using go 1.2 and I agree with @this.lau_

@photoionized 2014-04-10 17:24:04

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.

@King Jk 2017-03-02 07:11:17

I suggestionDo not use this way. It's will breaking godef. godef it does not understand about "." imports

@Mayur 2019-05-28 08:47:55

Thanks, this answer solved my issue

@Helin Wang 2014-07-22 16:14:35

another solution:
add src/myproject to $GOPATH.

Then import "mylib" will compile.

@Gustav 2016-04-28 10:50:30

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

Related Questions

Sponsored Content

10 Answered Questions

[SOLVED] Relative imports for the billionth time

23 Answered Questions

[SOLVED] Find the version of an installed npm package

  • 2012-06-10 20:36:27
  • Laurent Couvidou
  • 1008244 View
  • 1946 Score
  • 23 Answer
  • Tags:   node.js package npm

45 Answered Questions

[SOLVED] How do I import an SQL file using the command line in MySQL?

57 Answered Questions

[SOLVED] How do I include a JavaScript file in another JavaScript file?

8 Answered Questions

[SOLVED] beyond top level package error in relative import

11 Answered Questions

[SOLVED] How to find out which package version is loaded in R?

  • 2012-06-19 14:30:29
  • mpiktas
  • 302684 View
  • 351 Score
  • 11 Answer
  • Tags:   r package version

1 Answered Questions

1 Answered Questions

[SOLVED] golang custom struct undefined, can't import correctly

  • 2017-03-17 14:07:47
  • jj1111
  • 4727 View
  • 3 Score
  • 1 Answer
  • Tags:   go

1 Answered Questions

[SOLVED] Golang invalid import path when importing from "main" folder

2 Answered Questions

[SOLVED] GoLang and packages layout with relative paths

  • 2016-05-18 22:15:32
  • Roberto Milani
  • 1192 View
  • 1 Score
  • 2 Answer
  • Tags:   go package packages

Sponsored Content