go-learning/basics.go

181 lines
5.5 KiB
Go
Raw Normal View History

2023-07-09 21:13:24 +03:00
package main
//SECTION Package Import/Info
import ( // factored import statement, each line one package
"fmt" // Implements basic I/O
"reflect"
"math/rand" // Implements pseudo-random number generation
//UNSUITABLE for security-sensitive work bcs values are predictable
"math" // Basic mathematical functions
// Implements run-time reflection)
)
//!SECTION
func add(x int, y int) int { return x + y }
func add3(x, y int, z float64) float64 { return float64(x) + float64(y) + z }
func sep(name string) { fmt.Printf("\n\n|-----%s-----|\n", name) }
func msep() { fmt.Printf("\n---\n") }
func swap(x, y string) (string, string) { return y, x }
func naked() (x, z, y int) { // operators couldn't be used here
x = 10
y = 15
z = 20
return // naked return calls named values
// return z, y, x + z // Overrides to named return values BUT still needs 3 elements!!!
}
var python bool
// myvar := 10 // ERROR
func main() {
//SECTION I/O
fmt.Println("My favorite number is", rand.Intn(10))
fmt.Printf("Now you have %g problems.\n", math.Sqrt(7)) // C style I/O, printf
// fmt.Println("Now you have %g problems.\n", math.Sqrt(7)) // %g won't work
fmt.Println("Println inserts blanks between operands", "and appends a newline")
fmt.Printf("Type: %T, Value: %v", python, python)
//!SECTION
sep("Exported Names")
//SECTION Exported Names
fmt.Printf("if a name begins with a capital letter, it is exported and you can use it with importing package\n")
// fmt.Println(math.pi) WRONG
fmt.Println(math.Pi) // imports pi number
//!SECTION
sep("Values, Variables and Constants")
//SECTION Values, Variables and Constants
fmt.Printf("Data types in Go language:\n")
fmt.Printf(`
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // alias for uint8
rune // alias for int32
// represents a Unicode code point
float32 float64
complex64 complex128`)
//TODO add explanation for each data types
msep()
fmt.Printf("Data types of a variable is static. So you can't modify its type later in code (Like C, unlike python)\n")
var age int // var VARIABLE_NAME DATA_TYPE
age = 32 // = is assigment symbol
// age = "hello" // ERROR
fmt.Println(age)
fmt.Println("We can also declare multiple variable with same data type at once like: `var VAR1, VAR2 DATA_TYPE`")
var var1, var2, var3 int
fmt.Println("var statement can be at package or function level")
fmt.Println(var1, var2, var3, python)
msep()
fmt.Println("Variables with initializers")
var var4, var5 int = 1, 2
// var var4, var5 = 1, 2 // ALSO VALID even without datatype
// var var4, var5 = 1 // ERROR
// var var4, var5 = 1, 2, 3 // ERROR
fmt.Println(var4, var5)
fmt.Println("Different types also can be used together")
var var6, var7, var8 = true, 24.123, "yep"
fmt.Println(var6, var7, var8)
fmt.Println("Multiple variables can be defined also like this:")
var (
var9 int = 14
var10 = 1.34
)
fmt.Println(var9, var10)
fmt.Println("Zero values are 0 for numeric types, false for boolean, and empty string(\"\") for the strings")
msep()
fmt.Printf("You must assign first values to constants while declaring\n")
const msg1 = "Hello"
fmt.Printf("%s - %s", msg1, reflect.TypeOf(msg1)) // Automatically declaring the type as string
// msg1 = "Goodbye" //ERROR
fmt.Println("Numeric constants are high-precision values.")
msep()
fmt.Print("You can also use `:=` for both declaring and assigning a variable\nvariable's type is inferred from the value on the right hand side\n")
// var foo int = 10 // is the same thing with;
foo, foo2 := 10, "hi"
fmt.Println(foo, foo2)
fmt.Println("Not avaliable outside a function (package level)")
msep()
fmt.Println("Type conversions: Type(value) can be applied both with:")
var i int = 42
var f float64 = float64(i)
var u uint = uint(f)
fmt.Println(reflect.TypeOf(i), reflect.TypeOf(f), reflect.TypeOf(u))
// OR
i2 := 42
f2 := float64(i2)
u2 := uint(f2)
fmt.Println(reflect.TypeOf(i2), reflect.TypeOf(f2), reflect.TypeOf(u2))
fmt.Println("!!!In Go assigments explicit conversions required in different type conversions")
//!SECTION
sep("Functions")
//SECTION Functions
fmt.Printf("In Go, type comes after the variable name\nLike `x int`\n")
fmt.Println(add(10, 51)) // Tip: Ctrl+Click in VS Code for see function source quicly
// fmt.Println(add(10)) ERROR
// fmt.Println(add(10, 11, 12)) ERROR
msep()
fmt.Printf("Also return types comes after function name and variables\nJust leave a blank for use as void in C\n")
// More info about Go's decleration syntax LINK https://go.dev/blog/declaration-syntax
msep()
fmt.Printf("You can also shorten arguments line with just using last arguments type if they are same type\nLike `x, y int`\n")
fmt.Println(add3(10, 11, 12.0141))
fmt.Println(add3(10, 11, 12.01412352345)) // not precise
fmt.Println(add3(10, 11, 12)) // SUCCESS
//fmt.Println(add3(10.34, 11.53, 12.23)) // ERROR
msep()
fmt.Printf("A function can return multiple results\n")
a, b := swap("hello", "world")
fmt.Printf("%s %s\n", a, b)
msep()
fmt.Printf("Return values in functions may be named. a `return` statement returns the named values if arguments didn't supplied. This is known as a naked return\n")
fmt.Println("Naked return statements should be used only in short functions!!! Otherwise they can harm readability!!!")
fmt.Println("Note: You can't use `:=` anymore bcs you declared your variables in top of your function")
fmt.Println(naked())
//!SECTION
// sep()
}