Go is strongly typed language and type is life. Language has rich types and good support for extension of type. Type provides integrity.
In this post i will share some of primitive types and how Go handles them.
Everything is 0 or 1 in computer and only these 2 values are used to represent any values we want.
Arrangement of 0 or 1 tells what is the value.
Take a example of byte value at some memory location
Binary |
What is it ? You need type information .
If type is int then value is 10, if type of enum then some other value.
Type information tell us about value and size for eg if type is Boolean then it tells it is single byte value.
Information about types supported by Go can be found at Lang Spec Types page.
How to declare variable ?
var variablename type
variablename := value // Short declaration
Both of above declare variable but the way it is initialized is very different.
Var creates and initialized with ZERO value of its type, Zero value is very special it makes code bug free and clean! No null checks.
Zero value is based on Type so for integer type it is zero, boolean it is false , string it is empty.
Go has some type like int that gets size based on underlying architecture, for eg it will be 4 bytes(i.e 32 bit arch) or 8 bytes( 64 bit arc). This is also good example of mechanical sympathy to underlying platform.
Examples of variable declaration
Alias for built in type
This is very powerful feature and it allow built in types to be extended by adding behavior .
Example of type alias
In above example RichInt has toBinary function that returns binary value. I will share later how to extend types when we explore methods of types.
Casting Vs Conversion
Casting is magic, it allows to convert one type to another implicitly. How many times in java you lost value when long/int casting or double/float.
Go has concept of conversion, you explicitly convert from x to y type and pay the cost of extra memory at the cost of safety.
Go lang spec has some good examples.
Some real custom types
Go lang has support for Struct type, it is pure value type , no noise of behavior attached to it.
It gives control of memory layout, you can choose really compact memory layout to avoid padding or to add padding if required.
Struct can be declared like below
type person struct {
firstName string
lastName string
age int
}
Once struct is defined then we can create value of struct type.
It is value not object just remember that!
value can be created using below code
var p1 person
above code create value and initialized it with zero value, string is initialized to empty value and int to 0.
No null check is required when processing p1 because it is initialized to ZERO value
Short declaration can be used to specified non zero or other value
p2 := person{firstName: "James", lastName: "Bond", age: 35}
Zero value and convenient way to creating value kills the need of having constructor or destructor in Go.
You can now start seeing power of value. No overhead of constructor/destructor/ or complex life cycle.
I know you will have question on what about special init code or clean up code that is required ?
behavior are handled very differently, we will go over that in later post.
Struct can be nested also and Zero value or short declaration works like magic!
We will create additional struct
type address struct {
address1 string
address2 string
city string
}
type contact struct {
landLine int
mobile int
}
type person struct {
firstName string
lastName string
age int
add address
contactDetails contact
}
p3 := person{firstName: "James", lastName: "Bond", age: 35,
add: address{address1: "30 Wellington Square", address2: "Street 81"},
contactDetails: contact{mobile: 11119999}}
Code used in blog is available @ letsgo github repo
No comments:
Post a Comment