One perception I have about Go philosophy: 
 - Don't create futile abstractions;
 - Prefer not create abstractions if they will increase the quantity of 
code needed for the problem.

Example of these are the missing generic type system. People from other 
schools of thought (eg: Java) tend to prefer generic abstractions like 
collections. I not saying specificaly collections abstractions are futile, 
I just saying in Golang they are considered unecessary.

A common case example:

Golang:

index := 4
list = append(list[0:index], newItem, list[index:])

Java:

int index = 4;
list.insert(4, newItem);

Seeing that code shows exactly what the Golang is doing to insert the item 
in the list. In java code that implementation is dependent.

One example of futile abstractions are tests:

On Java, JUnit have tons of methods to assert an infinite possibilities of 
types. Eg: assertEquals, assertNotEquals, etc.

assertEquals("expected", result);

In Go, the standard test library has only the Fail (and some few others) 
method. The testing by itself are made of "if"s structures. Eg: 

if result != "expected {
    t.Fail("result " + result + " not expected") 
}

Even if Java style is somewhat smaller (in fact, there is as miracle code 
black hole in golang where all projects are commonly 30% smaller than Java 
counterparts), the Golang style is immediately readable as something 
obvious without the need to navigate in the inner classes of a framework 
like JUnit.

Once you get  the philosophy stuck in your head, there is no way back.  

Annotations, Context injection and configuration files are considered evil 
in Golang, where lambda-receiving-functions, Normal "constructors" (I know 
there is no real constructor, just common functions that play that role), 
and simple go code used for configurations are considered the norm. Eg:

Java:

@Transaction
public void savePerson(Person person) {
  persistence.save(person)
}

Golang:

func savePerson(p model.Person) {
  tr = transaction.NewTransaction()
  tr.OnTransaction(func() {
    persistence.save(p)
  });
}

The Golang code is easier to debug. Just need to browse to OnTransaction 
function. In Java is somewhat more dificult to know where the call is 
intercepted and the transaction is inserted.

Java: 

@WebServlet(name="myServlet", urlPatterns="/myServlet")

Golang:

http.Handle("/myPath", myHandler)

So in golang magic configuration are not well received. Its not that easy 
to see how a Servlet is configurated in a Java container, that knowlegde is 
given as granted by an framework/container. In Golang it is easily common 
to see how the things work under the hood.

In Golang a balance between performance and readability tends more to the 
side of performance than in other languages.

Eg: In Java abstraction and readability are the norm above all other 
things. Only when things get really ugly, tunning and performance are 
dealed on. Don't let me start about Hibernate/JPA!!

I use Java as a counter example because is what I work with. I love both 
languages with their strenghts and weakenesses. They are fundamentally 
contrary in terms of philosophy. 

Java = formality, abstractions, frameworks always that IS possible.

Golang = simplicity, economy of resources, speed, NOT use frameworks always 
that is possible.


Em segunda-feira, 28 de junho de 2010 10:43:48 UTC-3, Mayuresh Kathe 
escreveu:
>
> Like the UNIX philosophy (below);
> Write programs that do one thing and do it well.
> Write programs to work together.
> Write programs to handle text streams, because that is a universal 
> interface.
>
> Is there a philosophy to writing Go programs?
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to