# 03. Types of Type!

## Type System

{% hint style="success" %}
Type system is a set of rules that assigns a property called type to the various constructs of a computer program, such as variables, expressions, functions or modules
{% endhint %}

### Type Error

{% hint style="success" %}
&#x20;A *type error* is erroneous or undesirable *program* behavior caused by a discrepancy between differing data types for the *program's* constants, variables, and methods.
{% endhint %}

### Type Safety

{% hint style="success" %}
The extent to which a programming language discourages or prevents type errors
{% endhint %}

### Strong Typing

{% hint style="success" %}
A strongly typed language typically disallows implicit conversions between unrelated types
{% endhint %}

### Weak Typing

{% hint style="success" %}
A weakly typed language makes conversions between unrelated types implicitly
{% endhint %}

### Static Type Checking

{% hint style="success" %}
Static type checking is the process of verifying the type safety of a program based on analysis of source code.
{% endhint %}

### Dynamic Type Checking

{% hint style="success" %}
Dynamic type checking is the process of verifying the type safety of a program at run-time
{% endhint %}

### Manifest Typing

{% hint style="success" %}
Manifest typing is explicit identification by developer of the type of each variable being declared
{% endhint %}

### Type Inference

{% hint style="success" %}
Automatic detection of type based on usage.
{% endhint %}

### Duck Typing

{% hint style="success" %}
If it walks like a duck and it quacks like a duck, then it must be a duck
{% endhint %}

## Blog Posts

{% embed url="<https://www.ardanlabs.com/blog/2013/07/understanding-type-in-go.html>" %}
