Go Community Linklog

Made a library? Written a blog post? Found a useful tutorial? Share it with the Go community here or just enjoy what everyone else has found!

Go for the REST @jsTamer21k @gobuffalo_io

Buffalo comes with a uniform and consistent structure for web applications in Go, follows best practives of Go web development and covers the full lifecycle from development to production. Learn how to build a RESTful web application in Go using the buffalo framework. https://dev.to/remast/go-for-the-rest-1jp9

 Jan Stamer

Deploy a Buffalo App to Heroku

Deploy a Buffalo App to Heroku from Antonio Pagano.

A lot of things have changed in the Buffalo ecosystem since my last post on how to deploy to Heroku from Gitlab.

Indeed, everything has changed since I posted how to deploy from gitlab repo into Heroku with the birth of the buffalo-heroku plugin. In this post I will try and describe how to use it to deploy your buffalo app to Heroku.

 Brian Scott

API gateway examples with Traefik, Ambassador and Envoy

API gateway acts as a reverse proxy, routing API requests from clients to services. Usually it also performs authentication and rate limiting, so the services behind the gate don't have to. Check out short tutorials of Ambassador and Traefik that aim to tackle the problem, also there is Envoy example in https://github.com/marselester/apigate.

 Marsel Mavletkulov

Error handling example in DDD-style project with Go kit

Ben Johnson wrote Failure is your Domain post that explores the purpose of errors for app developers (error code), operators (stack trace), end users (human-readable message). https://github.com/marselester/ddd-err is an attempt to implement those ideas using Go kit.

 Marsel Mavletkulov

How to structure Go projects

New developers who come with Python/Ruby experience look for familiar framework concepts that fit their mental picture of how a web application should be structured. For some reason the same concepts do not resonate with Go. How to structure Go projects blog post shows that DDD (Domain-Driven Design) flavored approach is endorsed according to talks given at GopherCons.

 Marsel Mavletkulov

Kafka for Gophers slides

Kafka for Gophers presentation provides an overview of how to achieve reliable data delivery with Apache Kafka in Go. If you've ever felt uneasy about what might happen with your service when a message is lost or written more than once, you should read "Kafka: The Definitive Guide" book. When it comes to choose a Go library to work with Kafka, the decision could be tough. I would recommend to check out https://github.com/segmentio/kafka-go.

 Marsel Mavletkulov

How to Deploy GoBuffalo on Google's App Engine

Hey there,

If you use Buffalo and would like to deploy it to Google's App Engine, please visit this tutorial to find out more:

Deploy GoBuffalo on Google's App Engine

 Tomislav Biscan



Just a friendly reminder as the maintainer of this site, that our twitter integration is offline as Google recently discontinued the Google link service. We are transitioning to Firebase Dynamic links later this week. Also, posts will start to be moderated to ensure we deliver relevant and useful content to our Golang readers.

Thank you

Any questions email: feedback @ golangflow.io

 Brian Scott

Generis, a versatile code generator adding generics, free-form macros, conditional compilation, HTML templating and Allman style conversion to the Go language

Just to inform you that I’ve just released a first version of Generis, a lightweight code preprocessor adding the following features to the Go language :

  • Generics.
  • Free-form macros.
  • Conditional compilation.
  • HTML templating.
  • Allman style conversion.


It’s similar in function to both Ego and Genny, but implemented as a free-form C++ like preprocessor.

Sample :

package main;


import (


#define DebugMode
#as true

// ~~

#define HttpPort
#as 8080

// ~~

#define WriteLine( {{text}} )
#as log.Println( {{text}} )

// ~~

#define local {{variable}} : {{type}};
#as var {{variable}} {{type}};

// ~~

#define DeclareStack( {{type}}, {{name}} )
    // -- TYPES

    type {{name}}Stack struct
        ElementArray []{{type}};

    // -- INQUIRIES

    func ( stack * {{name}}Stack ) IsEmpty(
        ) bool
        return len( stack.ElementArray ) == 0;

    // -- OPERATIONS

    func ( stack * {{name}}Stack ) Push(
        element {{type}}
        stack.ElementArray = append( stack.ElementArray, element );

    // ~~

    func ( stack * {{name}}Stack ) Pop(
        ) {{type}}
            element : {{type}};

        element = stack.ElementArray[ len( stack.ElementArray ) - 1 ];

        stack.ElementArray = stack.ElementArray[ : len( stack.ElementArray ) - 1 ];

        return element;

// ~~

#define DeclareStack( {{type}} )
#as DeclareStack( {{type}}, {{type:PascalCase}} )

// -- TYPES

DeclareStack( string )
DeclareStack( int32 )


func HandleRootPage(
    response_writer http.ResponseWriter,
    request * http.Request
        boolean : bool;
        natural : uint;
        integer : int;
        real : float64;
        text : string;
        integer_stack : Int32Stack;

    boolean = true;
    natural = 10;
    integer = 20;
    real = 30.0;
    text = "text";
    escaped_text = "<escaped text/>";

    integer_stack.Push( 10 );
    integer_stack.Push( 20 );
    integer_stack.Push( 30 );

    #write response_writer
        <!DOCTYPE html>
        <html lang="en">
                <meta charset="utf-8">
                <title><%= request.URL.Path %></title>
                <% if ( boolean ) { %>
                    <%= "URL : " + request.URL.Path %>
                    <%@ natural %>
                    <%# integer %>
                    <%& real %>
                    <%~ text %>
                    <%= escaped_text %>
                    <%= "<%% ignored %%>" %>
                    <%% ignored %%>
                <% } %>
                Stack :
                <% for !integer_stack.IsEmpty() { %>
                    <%# integer_stack.Pop() %>
                <% } %>

// ~~

func main()
    http.HandleFunc( "/", HandleRootPage );

    #if DebugMode
        WriteLine( "Listening on http://localhost:HttpPort" );

        http.ListenAndServe( ":HttpPort", nil )

Creating a resumable file uploader in Go using tus protocol.


Go config management. support JSON, YAML, TOML, INI, HCL, ENV and Flags

gookit/config - Go config management. support JSON, YAML, TOML, INI, HCL, ENV and Flags. Multi file load, data override merge, parse ENV var.


  • Support multi format: JSON(default), INI, YAML, TOML, HCL
    • JSON content support comments. will auto clear comments
  • Support multi-file and multi-data loading
  • Support loading configuration from os ENV
  • Support for loading configuration data from remote URLs
  • Support for setting configuration data from command line arguments(flags)
  • Support data overlay and merge, automatically load by key when loading multiple copies of data
  • Support get sub value by path, like map.key arr.2
  • Support parse ENV name. like envKey: ${SHELL} -> envKey: /bin/zsh
  • Generic api Get Int Uint Int64 Float String Bool Ints IntMap Strings StringMap ...
  • Complete unit test(code coverage > 95%)

Provide a sub-package dotenv that supports importing data from files (eg .env) to ENV

Github Repo


txeh: Go library and CLI utilty for /etc/hosts management. @cjimti

txeh is a golang library and command line utility for working with /etc/hosts.

A computer's /etc/hosts file is a powerful utility for developers and system administrators to create localized, custom DNS entries. This small go library and utility were developed to encapsulate the complexity of working with /etc/hosts directly by providing a simple interface for adding and removing entries in a /etc/hosts file.


 Craig Johnston

Manage test dependencies with Go

Analogue to testing that a window can be opened in a house, you don't want to spend time building the house first. Instead you want to say: I need a house with a window and then you test the opening functionality. This is the approach we took with our framework for setting up objects to be tested using recipes, ingredients and special preparation (if needed).


 Konrad Kleine

Store and interact with go structs efficiently in Redis using go-rejson #redis #go #json


Instead of saving structs as json strings, use redislabs' ReJSON module with Redis Server to interact natively with JSON objects

ReJSON is a Redis module that implements ECMA-404 The JSON Data Interchange Standard as a native data type. It allows storing, updating and fetching JSON values from Redis keys (documents).

Go-ReJSON is the only go client library that supports both redigo and go-redis clients, and plans to support more redis Go clients in the future.

PRs are welcome !

 Nitish Malhotra