Go Concepts - The Type System: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 84: Line 84:
The user-defined types are introduced by the <tt>type</tt> keyword. There are two kinds of user-defined types: <tt>struct</tt>s and interfaces.
The user-defined types are introduced by the <tt>type</tt> keyword. There are two kinds of user-defined types: <tt>struct</tt>s and interfaces.


==Structs==
===[[Go Structs|Structs]]===
 
===I[[Go Interfaces|Interfaces]]===
<blockquote style="background-color: #f9f9f9; border: solid thin lightgrey;">
:[[Go Structs|Structs]]
</blockquote>
 
==Interfaces==
 
<blockquote style="background-color: #f9f9f9; border: solid thin lightgrey;">
:[[Go Interfaces|Interfaces]]
</blockquote>


=Conversion Between Types=
=Conversion Between Types=

Revision as of 01:27, 3 April 2016

Internal

Overview

Go is statically typed. Go designers tried to alleviate some of the "heaviness" associated with statically typed languages and made it "feel" like a dynamic language. For example Go uses local type inference, which eliminates the need to specify the type unnecessarily in program, the compiler figures it out.

Go is strongly typed meaning that yes cannot be unsafely coerced into other types they're not, or at least without programmer giving explicit permission. In JavaScript, for example, implicit conversion is done based on complicated rules that are not always easy to remember.

For more details on typing, see static typing vs. dynamic typing and strong typing vs. loose typing.

Go provides a hierarchy-free type system - there are no classes and no class inheritance. It is still an object-oriented language. Go type system encourages composition, where types are composed of smaller types.

Type Definition

Type Definition

Zero Value

Zero value for a specific type: 0 for ints, 0.0 for floats, "" for strings, false for Booleans and nil for pointers (0x0).

For reference types, their underlying data structures are initialized to their zero values, but variable declared as a reference type set to their zero values will return a value of nil. For example, the zero value for maps, slices and channels is nil.

Built-in Types

The definition of the following types can be found in $GO_HOME/src/builtin/builtin.go:

bool

Integers

Floating-Point Numbers

string

Arrays

Slices

Maps

error

Function Types

A function is member of a function type. The function type is defined by its signature:

func(input_param_type1, input_param_type2, ...) (return_type1, return_type2, ...)

Example of a function that requires an int and returns an int:

func(int) int
// a variable of type func(int) int is declared
var f func(int) int;

// the variable is initialized with an actual function
f = func(i int) int {
    return i + 1
}

Also see:

Function Literals

Pointer Types

A pointer type is declared using the dereference operator * placed in front of the target type - the type of the stored value:

*int

We cannot do pointer arithmetic. Assuming ptr is a *int, we cannot do ptr + 1 (compilation error message: invalid operation: ptr + 1 (mismatched types *int and int)) and we can't do ptr + ptr2 (compilation error message: invalid operation: ptr + ptr2 (operator + not defined on pointer)).

For more details, see pointers.

User-Defined Types

The user-defined types are introduced by the type keyword. There are two kinds of user-defined types: structs and interfaces.

Structs

IInterfaces

Conversion Between Types

In order to convert between types, the type name is used like a function:

var f float64 = 5.0
var i int = 5
...
result = f / float64(i)

This is equivalent with Java cast.

Note that the same syntax can be used to convert to and from user-defined types:

import "time"

...

var sleepSeconds int
sleepSeconds = 1

//
// time.Sleep expects a time.Duration do we convert time.Second to int, multiply and convert back to time.Duration
//
var duration time.Duration
duration = time.Duration(sleepSeconds * int(time.Second))
time.Sleep(duration)

Also see:

Conversion between bytes and strings

Reference Types

Reference types contain underlying data structures, which are initialized by default to their zero values. However, variable declared as a reference type set to their zero values will return a value of nil. Reference types: slices, maps, channels.

Primitive vs. Non-Primitive Nature