Go, I need your constructive critical comments.
For me constructive criticism is the fast way to learn. So here is my first simple bit of code (which I’m prepared to share).
How would you have done it differently and why is your way better than mine? What’s wrong with my Go style, and what bits are not go-idiomatic? – see it better at http://play.golang.org/p/9tOXSFUHT2
package configure import ( "github.com/laurent22/toml-go" "errors" "io/ioutil" ) type twitter struct { apiKey string apiSecret string userKey string userSecret string users toml.Value tags toml.Value errors error } func lang(this string) string { /* this is currently a placeholder. It just returns the string it's given. Eventually, However it will look for that string a those pulled from a language file based on the config language variable. Not elegant but the others I've looked at: http://stackoverflow.com/questions/14124630/i18n-strategies-for-go-with-app-engine gettext: a MO file parser go-18n Internationalization plan for Go Polyglot Aren't doing it for me*/ return this } func (this *twitter) Configure (file string) (*twitter, error) { var parser toml.Parser var clear toml.Value if _, err := ioutil.ReadFile(file); err != nil { //surely resetting the struct can't be this torturous? this.userKey = "" this.userSecret = "" this.apiKey = "" this.apiSecret = "" this.users = clear // return to this - surely this can't be the way to clear this variable. this.tags = clear // return to this - surely this can't be the way to clear this variable. this.errors = errors.New(lang("Could not find the Configuration File. You'll need to provide these setting for twitter to work.")) }else{ toml := parser.ParseFile(file) this.userKey = toml.GetString("twitter.user-key") this.userSecret = toml.GetString("twitter.user-secret") this.apiKey = toml.GetString("twitter.api-key", "26276391-gtihvXIuNXzCD4HTOjx8630O8IPq19m810TxkLMmd") this.apiSecret = toml.GetString("twitter.api-secret", "bYkulR93l70elsjZysjjDpxQT69RVF2GIUcjoMIkrADoc") this.users, _ = toml.GetValue("twitter.specific-users") this.tags, _ = toml.GetValue("twitter.specific-tags") this.errors = nil } return this, this.errors }
Why is this so short? Well I’d like to not be writing lots of bad code and then asking for comment! Code at http://play.golang.org/p/qEA9hXgEIT)
TESTS package configure import ( "testing" ) /* go test -v go test -cover go test -coverprofile=coverage.out go tool cover -func=cover.out go tool cover -html=coverage.out */ func TestLang(t *testing.T) { // test structure grabbed from https://talks.golang.org/2014/testing.slide#5 and modified accordingly. var tests = []struct { given string want string }{ {"test Strings", "test Strings"}, } for _, test := range tests { actual := lang(test.given) if actual != test.want { t.Errorf("Test Failed: Given '%v'; Expected '%v'; Got '%v'", test.given, test.want, actual) } } } func TestConfigure(t *testing.T) { twitterTest := new(twitter) // test structure grabbed from https://talks.golang.org/2014/testing.slide#5 and modified accordingly. var tests = []struct { given string want string shouldError bool }{ {"", "", true}, {"myconfig.toml", "26276391-gtihvXIuNXzCD4HTOjx8630O8IPq19m810TxkLMmd", false}, {"", "", true}, } for iCount, test := range tests { if actual, errors := twitterTest.Configure(test.given); errors == nil { if test.shouldError == true { // No error occured but errors expected t.Errorf("Test #%v Failed: 'Error Expected', but got 'No Error'", iCount) } else { if actual.apiKey != test.want { t.Errorf("Test Failed: Given '%v'; Wanted '%v'; Got '%v'", test.given, test.want, actual.apiKey) } } } else { if test.shouldError == false { // Error occured but No errors expected t.Errorf("Test #%v Failed: 'Error Occurred', but was 'Not Expected'", iCount) } } } }