I don't know if this is going to be a one time thing or something that I do on a regular basis. I thought it would be instructive to compare/contrast Go Programming to a mainstream language like Java. What follows is Java code listings followed by Go Programming listings. When possible I try to Idioms and code conventions adopted by those languages. To be fair on LOC, I use the built-in code formatting support of Eclipse.
I used the Goclipse Eclipse plugin and Java Eclipse IDE to format the code. I start with hello world and then I create a simple Employee class to show encapsulation and grouping behavior and data in the two languages.
Hello World! Java
/java-examples/src/com/example/Hello.java
package com.example;
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Now the same in Go Programming.
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
I had to get hello world out of the way. :)
Idiomatic Java class with getters and setters (properties) for Employee
/java-examples/src/com/example/encapsulation/Employee.java
package com.example.encapsulation;
public class Employee {
private String firstName;
private String lastName;
private int age;
private boolean current;
public Employee(String firstName, String lastName, int age, boolean current) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.current = current;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public boolean isCurrent() {
return current;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setAge(int age) {
this.age = age;
}
public void setCurrent(boolean current) {
this.current = current;
}
@Override
public String toString() {
return "Employee [firstName=" + firstName + ", lastName=" + lastName
+ ", age=" + age + ", current=" + current + "]";
}
}
Idiomatic Go Programming class equivalent with getters and setters (properties) for Employee
/examples/src/example/encapsulation/employee.go
package encapsulation
import "strconv"
type Employee struct {
firstName string
lastName string
age int
current bool
}
func NewEmployee(firstName string, lastName string, age int, current bool) *Employee {
return &Employee{firstName, lastName, age, current}
}
func (this *Employee) FirstName() string {
return this.firstName
}
func (this *Employee) LastName() string {
return this.lastName
}
func (this *Employee) Age() int {
return this.age
}
func (this *Employee) Current() bool {
return this.current
}
func (this *Employee) SetFirstName(name string) {
this.firstName = name
}
func (this *Employee) SetLastName(name string) {
this.lastName = name
}
func (this *Employee) SetAge(newAge int) {
this.age = newAge
}
func (this *Employee) SetCurrent(current bool) {
this.current = current
}
func (this *Employee) String() string {
return "Employee [firstName=" + this.firstName + ", lastName=" + this.lastName +
", age=" + strconv.Itoa(this.age) + ", current=" + strconv.FormatBool(this.current) + "]"
}
Note that I used the variable this but it is more common to use things like emp or e. I used this to make it more clear to Java programmers what I was doing.
Using Java Employee class
/java-examples/src/com/example/UseEncapsulation.java
package com.example;
import com.example.encapsulation.Employee;
public class UseEncapsulation {
public static void main(String[] args) {
Employee employee = new Employee("Rick", "Hightower", 32, true);
System.out.println("" + employee);
employee.setLastName("Smith");
employee.setAge(45);
System.out.printf("Name = %s, %s | Age = %d \n",
employee.getFirstName(), employee.getLastName(),
employee.getAge());
}
}
Using Go Programming struct (aka class)
examples/src/useEncapsulation.go
package main
import (
"example/encapsulation"
"fmt"
)
func main() {
employee := encapsulation.NewEmployee("Rick", "Hightower", 32, true)
fmt.Println(employee)
employee.SetLastName("Smith")
employee.SetAge(45)
fmt.Printf("Name = %s, %s | Age = %d \n", employee.FirstName(), employee.LastName(), employee.Age())
}
The output for both are the same
Employee [firstName=Rick, lastName=Hightower, age=32, current=true] Name = Rick, Smith | Age = 45More to come....
No comments:
Post a Comment