The official has a good information on
how to structure your Go code. In this blog, I am going to explain a little bit more about it.
Let's say we want to create a Go project containing a command and a package.
workspace1/
|-- build.sh
`-- src
`-- mylib
|-- hello
| `-- hello.go (package)
`-- main.go (command)
hello.go
package hello
import "fmt"
func SayHello() {
fmt.Println("Hello")
}
main.go
package main
import "mylib/hello"
func main() {
hello.SayHello()
}
build.sh
#!/bin/bash
export GOPATH=`pwd`
go install mylib/hello
go install mylib
Calling build.sh will create this structure.
workspace1/
|-- bin
| `-- mylib (executable)
|-- build.sh
|-- pkg
| `-- linux_amd64
| `-- mylib
| `-- hello.a (library)
`-- src
`-- mylib
|-- hello
| `-- hello.go (package)
`-- main.go (command)
In order to make mylib project go-gettable, let's make it into a Git project. Take a note that we will be creating a Git project in the mylib directory and not in the workspace1 directory.
1. cd workspace1/src/mylib
2. git init
3. git add .
4. git commit -m "Initial commit"
5. Push this repository to the remote URL
Now let's create another project that uses mylib. This new project is a simple project that uses mylib.
workspace2/
|-- build.sh
`-- src
`-- myapp
`-- app
`-- app.go (command)
1. cd workspace2
2. git init
3. git add submodule [mylib_git_url] src/mydomain/user/mylib (the src/mydomain/user is just a convention, you can also set the path to src/mylib)
After the submodule addition, we will have this structure.
workspace2/
|-- build.sh
`-- src
|-- myapp
| `-- app
| `-- app.go (command)
`-- mydomain
`-- user
`-- mylib
|-- hello
| `-- hello.go (package)
`-- main.go (command)
app.go
package main
import (
"fmt"
"mydomain/user/mylib/hello"
)
func main() {
fmt.Println("Do something")
hello.SayHello()
}
build.sh
#!/bin/bash
export GOPATH=`pwd`
go install mydomain/user/mylib/hello
go install myapp/app
Calling build.sh will create this structure.
workspace2/
|-- bin
| `-- app (executable)
|-- build.sh
|-- pkg
| `-- linux_amd64
| `-- mydomain
| `-- user
| `-- mylib
| `-- hello.a (library)
`-- src
|-- myapp
| `-- app
| `-- app.go (command)
`-- mydomain
`-- user
`-- mylib
|-- hello
| `-- hello.go (package)
`-- main.go (command - not used)
No comments:
Post a Comment