| @ -0,0 +1,18 @@ | |||
| package main | |||
| import ( | |||
| "errors" | |||
| "fmt" | |||
| ) | |||
| var ( | |||
| ErrInvalidLastName = errors.New("invalid last name") | |||
| ErrInvalidRoutingNumber = errors.New("invalid routing number") | |||
| ) | |||
| func main() { | |||
| fmt.Println(ErrInvalidLastName) | |||
| fmt.Println(ErrInvalidRoutingNumber) | |||
| } | |||
| @ -0,0 +1,70 @@ | |||
| package main | |||
| import ( | |||
| "errors" | |||
| "fmt" | |||
| "strings" | |||
| ) | |||
| type directDeposit struct { | |||
| lastName string | |||
| firstName string | |||
| bankName string | |||
| routingNumber int | |||
| accountNumber int | |||
| } | |||
| var ( | |||
| ErrInvalidLastName = errors.New("invalid last name") | |||
| ErrInvalidRoutingNumber = errors.New("invalid routing number") | |||
| ) | |||
| func (d *directDeposit) validateRoutingNumber() error { | |||
| if d.routingNumber < 100 { | |||
| return ErrInvalidRoutingNumber | |||
| } | |||
| return nil | |||
| } | |||
| func (d *directDeposit) validateLastName() error { | |||
| d.lastName = strings.TrimSpace(d.lastName) | |||
| if len(d.lastName) == 0 { | |||
| return ErrInvalidLastName | |||
| } | |||
| return nil | |||
| } | |||
| func (d *directDeposit) report() { | |||
| fmt.Println(strings.Repeat("*", 40)) | |||
| fmt.Println("Last Name: ", d.lastName) | |||
| fmt.Println("First Name: ", d.firstName) | |||
| fmt.Println("Bank Name: ", d.bankName) | |||
| fmt.Println("Routing Number:", d.routingNumber) | |||
| fmt.Println("Account Number:", d.accountNumber) | |||
| } | |||
| func main() { | |||
| dp := directDeposit{ | |||
| "", | |||
| "Abe", | |||
| "XYZ Inc", | |||
| 17, | |||
| 1809, | |||
| } | |||
| if err := dp.validateRoutingNumber(); err != nil { | |||
| fmt.Println(err) | |||
| } | |||
| if err := dp.validateLastName(); err != nil { | |||
| fmt.Println(err) | |||
| } | |||
| dp.report() | |||
| } | |||
| @ -0,0 +1,68 @@ | |||
| package main | |||
| import ( | |||
| "errors" | |||
| "fmt" | |||
| "strings" | |||
| ) | |||
| type directDeposit struct { | |||
| lastName string | |||
| firstName string | |||
| bankName string | |||
| routingNumber int | |||
| accountNumber int | |||
| } | |||
| var ( | |||
| ErrInvalidLastName = errors.New("invalid last name") | |||
| ErrInvalidRoutingNumber = errors.New("invalid routing number") | |||
| ) | |||
| func (d *directDeposit) validateRoutingNumber() error { | |||
| if d.routingNumber < 100 { | |||
| panic(ErrInvalidRoutingNumber) | |||
| } | |||
| return nil | |||
| } | |||
| func (d *directDeposit) validateLastName() error { | |||
| d.lastName = strings.TrimSpace(d.lastName) | |||
| if len(d.lastName) == 0 { | |||
| return ErrInvalidLastName | |||
| } | |||
| return nil | |||
| } | |||
| func (d *directDeposit) report() { | |||
| fmt.Println(strings.Repeat("*", 40)) | |||
| fmt.Println("Last Name: ", d.lastName) | |||
| fmt.Println("First Name: ", d.firstName) | |||
| fmt.Println("Bank Name: ", d.bankName) | |||
| fmt.Println("Routing Number:", d.routingNumber) | |||
| fmt.Println("Account Number:", d.accountNumber) | |||
| } | |||
| func main() { | |||
| dp := directDeposit{ | |||
| "", | |||
| "Abe", | |||
| "XYZ Inc", | |||
| 17, | |||
| 1809, | |||
| } | |||
| _ = dp.validateRoutingNumber() | |||
| if err := dp.validateLastName(); err != nil { | |||
| fmt.Println(err) | |||
| } | |||
| dp.report() | |||
| } | |||
| @ -0,0 +1,74 @@ | |||
| package main | |||
| import ( | |||
| "errors" | |||
| "fmt" | |||
| "strings" | |||
| ) | |||
| type directDeposit struct { | |||
| lastName string | |||
| firstName string | |||
| bankName string | |||
| routingNumber int | |||
| accountNumber int | |||
| } | |||
| var ( | |||
| ErrInvalidLastName = errors.New("invalid last name") | |||
| ErrInvalidRoutingNumber = errors.New("invalid routing number") | |||
| ) | |||
| func (d *directDeposit) validateRoutingNumber() error { | |||
| defer func() { | |||
| if err := recover(); err == ErrInvalidRoutingNumber { | |||
| fmt.Println(err) | |||
| } | |||
| }() | |||
| if d.routingNumber < 100 { | |||
| panic(ErrInvalidRoutingNumber) | |||
| } | |||
| return nil | |||
| } | |||
| func (d *directDeposit) validateLastName() error { | |||
| d.lastName = strings.TrimSpace(d.lastName) | |||
| if len(d.lastName) == 0 { | |||
| return ErrInvalidLastName | |||
| } | |||
| return nil | |||
| } | |||
| func (d *directDeposit) report() { | |||
| fmt.Println(strings.Repeat("*", 40)) | |||
| fmt.Println("Last Name: ", d.lastName) | |||
| fmt.Println("First Name: ", d.firstName) | |||
| fmt.Println("Bank Name: ", d.bankName) | |||
| fmt.Println("Routing Number:", d.routingNumber) | |||
| fmt.Println("Account Number:", d.accountNumber) | |||
| } | |||
| func main() { | |||
| dp := directDeposit{ | |||
| "", | |||
| "Abe", | |||
| "XYZ Inc", | |||
| 17, | |||
| 1809, | |||
| } | |||
| _ = dp.validateRoutingNumber() | |||
| if err := dp.validateLastName(); err != nil { | |||
| fmt.Println(err) | |||
| } | |||
| dp.report() | |||
| } | |||
| @ -0,0 +1,28 @@ | |||
| package main | |||
| import ( | |||
| "errors" | |||
| "fmt" | |||
| ) | |||
| func main() { | |||
| test() | |||
| fmt.Println("This line will not get printed") | |||
| } | |||
| func test() { | |||
| n := func() { | |||
| fmt.Println("Defer in test") | |||
| } | |||
| defer n() | |||
| msg := "good-bye" | |||
| message(msg) | |||
| } | |||
| func message(msg string) { | |||
| f := func() { | |||
| fmt.Println("Defer in message func") | |||
| } | |||
| defer f() | |||
| if msg == "good-bye" { | |||
| panic(errors.New("something went wrong")) | |||
| } | |||
| } | |||
| @ -0,0 +1,26 @@ | |||
| package main | |||
| import ( | |||
| "errors" | |||
| "fmt" | |||
| ) | |||
| func main() { | |||
| a() | |||
| fmt.Println("This line will now get printed from main() function") | |||
| } | |||
| func a() { | |||
| b("good-bye") | |||
| fmt.Println("Back in function a()") | |||
| } | |||
| func b(msg string) { | |||
| defer func() { | |||
| if r := recover(); r != nil { | |||
| fmt.Println("error in func b()", r) | |||
| } | |||
| }() | |||
| if msg == "good-bye" { | |||
| panic(errors.New("something went wrong")) | |||
| } | |||
| fmt.Print(msg) | |||
| } | |||
| @ -0,0 +1,17 @@ | |||
| package main | |||
| import "fmt" | |||
| func main() { | |||
| nums := []int{2, 4, 6, 8} | |||
| total := 0 | |||
| // for i := 0; i <= 10; i++ { | |||
| for num, _ := range nums { | |||
| total += num | |||
| } | |||
| fmt.Println("Total:", total) | |||
| } | |||
| @ -0,0 +1,16 @@ | |||
| package main | |||
| import "fmt" | |||
| func main() { | |||
| km := 2 | |||
| // if km > 2 { | |||
| if km >= 2 { | |||
| fmt.Println("Take the car") | |||
| } else { | |||
| fmt.Println("Going to walk today") | |||
| } | |||
| } | |||
| @ -0,0 +1,52 @@ | |||
| package main | |||
| import ( | |||
| "errors" | |||
| "fmt" | |||
| ) | |||
| var ( | |||
| ErrHourlyRate = errors.New("invalid hourly rate") | |||
| ErrHoursWorked = errors.New("invalid hours worked per week") | |||
| ) | |||
| func main() { | |||
| pay, err := payDay(81, 50) | |||
| if err != nil { | |||
| fmt.Println(err) | |||
| } | |||
| pay, err = payDay(80, 5) | |||
| if err != nil { | |||
| fmt.Println(err) | |||
| } | |||
| pay, err = payDay(80, 50) | |||
| if err != nil { | |||
| fmt.Println(err) | |||
| } | |||
| fmt.Println(pay) | |||
| } | |||
| func payDay(hoursWorked, hourlyRate int) (int, error) { | |||
| if hourlyRate < 10 || hourlyRate > 75 { | |||
| return 0, ErrHourlyRate | |||
| } | |||
| if hoursWorked < 0 || hoursWorked > 80 { | |||
| return 0, ErrHoursWorked | |||
| } | |||
| if hoursWorked > 40 { | |||
| hoursOver := hoursWorked - 40 | |||
| overTime := hoursOver * 2 | |||
| regularPay := 40 * hourlyRate | |||
| return regularPay + overTime, nil | |||
| } | |||
| return hoursWorked * hourlyRate, nil | |||
| } | |||
| @ -0,0 +1,43 @@ | |||
| package main | |||
| import ( | |||
| "errors" | |||
| "fmt" | |||
| ) | |||
| var ( | |||
| ErrHourlyRate = errors.New("invalid hourly rate") | |||
| ErrHoursWorked = errors.New("invalid hours worked per week") | |||
| ) | |||
| func main() { | |||
| pay := payDay(81, 50) | |||
| fmt.Println(pay) | |||
| } | |||
| func payDay(hoursWorked, hourlyRate int) int { | |||
| report := func() { | |||
| fmt.Printf("hoursWorked: %d\nhourlyRate: %d\n", hoursWorked, hourlyRate) | |||
| } | |||
| defer report() | |||
| if hourlyRate < 10 || hourlyRate > 75 { | |||
| panic(ErrHourlyRate) | |||
| } | |||
| if hoursWorked < 0 || hoursWorked > 80 { | |||
| panic(ErrHoursWorked) | |||
| } | |||
| if hoursWorked > 40 { | |||
| hoursOver := hoursWorked - 40 | |||
| overTime := hoursOver * 2 | |||
| regularPay := 40 * hourlyRate | |||
| return regularPay + overTime | |||
| } | |||
| return hoursWorked * hourlyRate | |||
| } | |||
| @ -0,0 +1,55 @@ | |||
| package main | |||
| import ( | |||
| "errors" | |||
| "fmt" | |||
| ) | |||
| var ( | |||
| ErrHourlyRate = errors.New("invalid hourly rate") | |||
| ErrHoursWorked = errors.New("invalid hours worked per week") | |||
| ) | |||
| func main() { | |||
| pay := payDay(100, 25) | |||
| fmt.Println(pay) | |||
| pay = payDay(100, 200) | |||
| fmt.Println(pay) | |||
| pay = payDay(60, 25) | |||
| fmt.Println(pay) | |||
| } | |||
| func payDay(hoursWorked, hourlyRate int) int { | |||
| defer func() { | |||
| if r := recover(); r != nil { | |||
| if r == ErrHourlyRate { | |||
| fmt.Printf("hourly rate: %d -> err: %v\n\n", hourlyRate, r) | |||
| } | |||
| if r == ErrHoursWorked { | |||
| fmt.Printf("hours worked: %d -> err: %v\n\n", hoursWorked, r) | |||
| } | |||
| } | |||
| fmt.Printf("Pay was calculated based on:\nhours worked: %d\nhourly rate: %d\n", | |||
| hoursWorked, hourlyRate) | |||
| }() | |||
| if hourlyRate < 10 || hourlyRate > 75 { | |||
| panic(ErrHourlyRate) | |||
| } | |||
| if hoursWorked < 0 || hoursWorked > 80 { | |||
| panic(ErrHoursWorked) | |||
| } | |||
| if hoursWorked > 40 { | |||
| hoursOver := hoursWorked - 40 | |||
| overTime := hoursOver * 2 | |||
| regularPay := 40 * hourlyRate | |||
| return regularPay + overTime | |||
| } | |||
| return hoursWorked * hourlyRate | |||
| } | |||