2018-10-13 23:30:21 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								## Why you want to define new types?
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								1.  To declare new methods 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								2.  For type-safety 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								3.  For readability and conveying meaning 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								4.  All of the options above *CORRECT*  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-19 20:31:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  **1-3:** Yes, that's only one of the reasons.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
									
										
										
										
											2018-10-13 23:30:21 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-09 13:34:51 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Let's suppose that you've declared the following defined type. Which property below the new type doesn't get from its underlying type?
  
						 
					
						
							
								
									
										
										
										
											2018-10-13 23:30:21 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```go
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// For example, let's say that you've defined a new type
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// using time.Duration type like this:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type Millennium time.Duration
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								1.  Methods *CORRECT*  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								2.  Representation 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								3.  Size 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								4.  Range of values 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-19 20:31:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  **1:** That's right. A defined type doesn't get its source type's methods.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>  **2-4:** Actually the defined type gets it from its underlying type.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
									
										
										
										
											2018-10-13 23:30:21 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## How to define a new type using float32?
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								1.  `var radius float32`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								2.  `radius = type float32`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								3.  `type radius float32`  *CORRECT*  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								4.  `type radius = float32`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-19 20:31:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  **1-2:** This is not a correct syntax.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>  **3:** `radius` is a new type, defined using `float32`.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>  **4:** This declares `radius` as an alias to `float32`. So, they become the same types.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
									
										
										
										
											2018-10-13 23:30:21 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## How to fix the following code?
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```go
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type Distance int
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								var (
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    village Distance = 50
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    city = 100
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								fmt.Print(village + city)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								1.  `int(village + city)`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								2.  `village + int(city)`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								3.  `village(int) + city`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								4.  `village + Distance(city)`  *CORRECT*  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-19 20:31:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  **1-3:** There's a type mismatch in this code. But, this won't fix it.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>  **4:** That's right. Now, the `city`'s type is Distance in the expression.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
									
										
										
										
											2018-10-13 23:30:21 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## For the following program which types you might want to declare?
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```go
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								package main
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import "fmt"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func main() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									celsius := 35.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fahrenheit := (9*celsius + 160) / 5
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									fmt.Printf("%g ºC is %g ºF\n", celsius, fahrenheit)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								1.  Celsius and Fahrenheit using int64 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								2.  Celsius and Fahrenheit using float64 *CORRECT*  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								3.  Temperature using int64 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								4.  Temperature using uint32 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-19 20:31:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  **1:** But a degree value has a floating part. So, using an integer may not the best way.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>  **2:** float64 can represent a degree value.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>  **3-4:** But a degree value has a floating part. So, using an integer may not the best way. Also, there are two different temperature units here: Celsius and Fahrenheit. Isn't it better to create two distinct types?
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
									
										
										
										
											2018-10-13 23:30:21 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## What's the underlying type of the Millennium type?
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```go
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type (
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Duration int64
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Century Duration
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Millennium Century
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								1.  `int64`  *CORRECT*  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								2.  `Duration`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								3.  `Century`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								4.  Another type 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-19 20:31:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  **1:** That's right. Go's type system is flat. So, the defined type's underlying type is a type with a real structure. int64 is not just a name, it has its own structure, it's a predeclared type.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
									
										
										
										
											2018-11-09 13:34:51 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  **2:** Duration is just a new type name. It doesn't have its own structure.
  
						 
					
						
							
								
									
										
										
										
											2018-10-19 20:31:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
									
										
										
										
											2018-11-09 13:34:51 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  **3:** Century is just a new type name. It doesn't have its own structure.
  
						 
					
						
							
								
									
										
										
										
											2018-10-19 20:31:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
									
										
										
										
											2018-10-13 23:30:21 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Which types do not need to be converted between each other?
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								**HINT:** Aliased types do not require type conversion.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								1.  byte and uint8 *CORRECT*  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								2.  byte and rune 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								3.  rune and uint8 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								4.  byte and uint32 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-19 20:31:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  **1:** byte data type is an alias to uint8 data type. So, they don't need conversion between each other. They're the same types.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>
							 
						 
					
						
							
								
									
										
										
										
											2018-10-13 23:30:21 +03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Which types do not need to be converted between each other?
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								**HINT:** Aliased types do not require type conversion.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								1.  byte and uint32 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								2.  byte and rune 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								3.  rune and int32 *CORRECT*  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								4.  byte and int8 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-19 20:31:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  **3:** rune data type is an alias to int32 data type. So, they don't need conversion between each other. They're the same types.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>