Ernest Micklei's Blog

things I create and problems I solve, to remember and share

Javascript CLI in Go using Otto

Today, I was playing with Otto and hacked together a small command-line-interface program in Go. package main import ( "bufio" "fmt" "os" "strings" "github.com/robertkrimen/otto" ) var Otto = otto.New() func main() { fmt.Println("otto\n") loop() } func dispatch(entry string) string { if len(entry) == 0 { return entry } value, err := Otto.Run(entry) if err != nil { return err.Error() } else { return fmt.Sprintf("%v", value) } } func loop() { for { fmt.

From multiple to single-value context in Go

These are the results of exploring one aspect of the Go language; functions can return multiple values. Consider the following simple function: func ab() (a,b int) { a,b = 1,2 return } Clearly, this function cannot be used in other function calls that expect a single value. fmt.Printf("%v\n",ab()) The compiler will help you: “multiple-value ab() in single-value context”. Now suppose you want to take only the first value without introducing an intermediate variable.

A case of sizing and draining buffered Go channels

Update: Based on several comments posted on the Google+ Go community, I rewrote the solution presented here. See past the Conclusion section. Recently, I was asked to write a small program for collecting product promotion information for a large collection of products. Given an input file of product identifiers, the following tasks had to be done: read all identifiers from an input file for each identifier, fetch product offer information in XML parse the offer XML into in a DOM document extract all promotions from the offer document for each promotion, export its data into a CSV record A straightforward implementation is to write a function for each task and call them in a nested loop.

Hopwatch - a debugging tool for Go

Hopwatch is an experimental tool that can help debugging Go programs. Unlike most debuggers, hopwatch requires you to insert function calls at points of interest in your program. At these program locations, you can tell Hopwatch to display variable values and suspend the program (or goroutine). Hopwatch uses Websockets to exchange commands between your program and the debugger running in a HTML5 page. Using Hopwatch Basically, there are two functions Display and Break.

Methods as objects in Go

In an earlier post, I discussed an example of using plain functions as objects. Today, I investigated solutions for using Methods as objects. As I understand it, Go methods are functions that are “bound” to a named type that is not a pointer or an interface. package main import "fmt" type T struct { S string } func (t T) GetS1() string { return t.S } func (t *T) GetS2() string { return t.

go-restful first working example

In a previous post, I discussed the design of go-restful which is a package for building REST-style WebServices using the Google Go programming language. Today, I completed the implementation of that package which provides the basics: Creating a WebService with Routes (mapping between Http Request and a Go function) Each Route requires information about the Http method (GET,POST,...), URL Path (/users..), Mime-types and the function it binds to Functions get passed in a Request and a Response The Request is used to access Path and Query parameters , Headers and request content (XML, JSON,.

First class functions in Go

Today, I played with functions as objects in the Go programming language. If functions are first class citizens in Go then it must be possible to store them in fields of a struct, pass them as arguments to other functions and use them as return values of other functions. So I visited play.golang.org for putting together a simple program that demonstrates this. package main import "fmt" func CallWith(f func(string), who string) { f(who) } type FunctionHolder struct { Function func(string) } func main() { holder := FunctionHolder{ func(who string) { fmt.

go-restful api design

I have been using JAX-RS for many REST-based service implementations in Java. As part of my journey into the Google Go programming language, I am exploring designs for such REST support using the standard net/http package in Go. JAX-RS provides a set of Annotation classes which can be used to add meta-data to classes, methods and method arguments. In JAX-RS these annotation are used to specify the mapping between a Http Request to a Java method and its arguments.

renderShark - lean application server for renderSnake

I started working on this “yet-another-web-server” project for one of the most important reasons: because its fun. I got inspired for doing this after reading about the Netty framework and all the positive reviews that people write. My requirements for this server are provide a minimal MVC framework that uses renderSnake to render HTML pages (distributed) Http session management using JBOSS Infinispan, a modern caching solution use Netty , a well-designed fast server framework which I will use for its HTTP support components are wired together using Guice, a lean dependency injection library support for a minimal feature set to run Web applications GET, POST Redirects,Forwards Sessions, Cookies Error Handling (404,500,.

6hoek.com, a showcase for renderSnake

For the past month, I have been working on a new iPad Web application that recently was launched at 6hoek.com. This application provides easy access to the complete product catalog of the Dutch online webshop bol.com. Because it is targeted to owners of tablet devices such as the Apple iPad, I decided to embrace the upcoming JQuery Mobile framework (JQM), an open-source Javascript library that provides an unified UI to various mobile devices.