应用程序与包中的Golang项目结构

My organization uses Rails to develop its app but I'm attempting to re-write one of our back-end processes in Golang because it's much quicker.

I've structure my application with our company a namespace for my app (example.co), and a subfolder for each of the packages within my app.

Each library that I've included (e.g. sqlx, etc...) also has it's own folder.

src/
  github.com/
    jmoiron/
      (sqlx package files)
  example.co
    my_app/
      (my app package files)
    model/
      (model package files...)

However looking at other packages like sqlx, it appears they scrap this directory structure entirely and put all their files in the root directory

Is this because I'm writing an application and sqlx is a package that's meant to be included in other applications? Or is it just a difference in preference since there's no real accepted "standard"

I did this too on my first project. I have since learned:

  • the $GOPATH/bin/ pkg/ src/ layout is constructed by go get and similar commands
  • you can organize your .go files as a single flat project dir or with subfolders (caveat: all .go files in the same folder must have the same package name)
  • put other people's code in a /vendor directory inside your project root, if it is code your app needs to work (google this, it's the worst part of go imo)
  • put your own project under your gopath, symlink to it if you want it more accessible

So I would imagine your code could look something like:

/Users/user2490003/MyGoPath/
▾ src/github.com/user2490003/myproject/
  ▾ model/
      user.go
  ▾ myapp/
      myapp.go
  ▾ vendor/github.com/jmoiron/sqlx/
      sqlx.go
    main.go

Import the full package references, like this:

// main.go
package main
import (
  github.com/jmoiron/sqlx
  github.com/user2490003/myproject/myapp
  github.com/user2490003/myproject/model
)

I would recommend to start with a layout that seems logical and works at the present moment and then refactor/restructure as needed when your applications grows and evolves.

Using your company namespace is reasonable - I would consider creating a directory for your app underneath it (such as company.co/my_app) and inside of it, subdirectories for library packages (for example, company.co/my_app/db etc.) as well as the cmd one that would contain directories for the actual executables (package main programs) that you want to produce: cmd/exe1, cmd/exe2 etc. This will allow you to have multiple executables as well as multiple library "subpackages" inside of the my_app which can be included independently with the corresponding import path.

Each library that I've included (e.g. sqlx, etc...) also has it's own folder.

If you are ok with using the latest version of dependencies from Github, you don't have to include the dependencies' code into your repositories but instead install them with go get into the build area. If you want to build from a local copy - and for corporate usage, it may be preferable for stability and audit track - you should put them in a vendor subdirectory, for example company.co/my_app/vendor/github.com/jmoiron/sqlx. This way you have control on when you upgrade to a newer version of the dependencies and assurance that the upstream changes will not break your build or otherwise affect your programs without your knowledge and until you have a chance to do thorough testing.