{"id":20113151,"url":"https://github.com/cloudacademy/learn-go","last_synced_at":"2025-08-21T01:06:57.003Z","repository":{"id":77791611,"uuid":"239613111","full_name":"cloudacademy/learn-go","owner":"cloudacademy","description":"Introduction to the Go Programming Language","archived":false,"fork":false,"pushed_at":"2020-02-22T04:05:53.000Z","size":10,"stargazers_count":7,"open_issues_count":0,"forks_count":8,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-06T11:35:46.475Z","etag":null,"topics":["cloudacademy","devops","go","golang","playgroud","programming-languages","sdk"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cloudacademy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-02-10T21:05:22.000Z","updated_at":"2024-03-12T06:10:29.000Z","dependencies_parsed_at":"2023-04-30T04:36:23.385Z","dependency_job_id":null,"html_url":"https://github.com/cloudacademy/learn-go","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cloudacademy/learn-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudacademy%2Flearn-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudacademy%2Flearn-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudacademy%2Flearn-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudacademy%2Flearn-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cloudacademy","download_url":"https://codeload.github.com/cloudacademy/learn-go/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudacademy%2Flearn-go/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271410702,"owners_count":24754777,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-20T02:00:09.606Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudacademy","devops","go","golang","playgroud","programming-languages","sdk"],"created_at":"2024-11-13T18:23:26.683Z","updated_at":"2025-08-21T01:06:56.995Z","avatar_url":"https://github.com/cloudacademy.png","language":null,"readme":"# Learn Go\n\n# Demo1 - Hello World\nhttps://play.golang.org/p/mHIEl2BLCxl\n\n```\npackage main\n\nimport (\n\t\"fmt\"\n)\n\nfunc main() {\n\tfmt.Println(\"Hello World!\")\n}\n```\n\n# Demo2 - String Variables\nhttps://play.golang.org/p/dkiM_uDsmjV\n\n```\npackage main\n\nimport (\n\t\"fmt\"\n)\n\nvar (\n\tName1 string = \"global1\"\n\tName2 string = \"global2\" \n)\n\nvar var1, var2 string = \"local1\", \"local2\"\n\nfunc main() {\n\tvar name1 string\n\tvar name2 string = \"CloudAcademy\"\n\tname3 := \"DevOps 2020\"\n\tname4 := name2 + \" \" + name3\n\n\tfmt.Println(name1) //prints empty string\n\tname1 = \"Blah\"\n\tfmt.Println(name1) //prints Blah\n\n\tfmt.Println(name2)\n\tfmt.Println(name3)\n\tfmt.Println(name4)\n\t\n\tfmt.Printf(\"%v -- %v\\n\", name2, name3)\t\n\t\n\tfmt.Println(Name1, Name2, var1, var2)\n}\n```\n\n# Demo3 - Integer Variables\nhttps://play.golang.org/p/22RthR5k6nH\n\n```\npackage main\n\nimport (\n\t\"fmt\"\n)\n\nfunc main() {\n\tvar count1 int\n\tvar count2 int = 100\n\tcount3 := 200\n\tcount4 := count2 + count3\n\n\tfmt.Println(count1) //prints 0\n\tcount1 = 10\n\tfmt.Println(count1) //prints 10\n\n\tfmt.Println(count2)\n\tfmt.Println(count3)\n\tfmt.Println(count4)\n\t\n\tcount3++\n\tcount4--\n\t\n\tfmt.Println(count3)\n\tfmt.Println(count4)\t\n}\n```\n\n# Demo4 - Boolean Variables\nhttps://play.golang.org/p/laJJ0IhK94V\n\n```\npackage main\n\nimport (\n\t\"fmt\"\n)\n\nfunc main() {\n\tvar isBig bool //defaults to false\n\tvar isFast, hasFourWheels bool = false, true\n\n    \tfmt.Println(isBig)\n    \tfmt.Println(isFast)\n\tfmt.Println(hasFourWheels)\n\t\n\tfmt.Println(!hasFourWheels)\t\n\tfmt.Println(isFast \u0026\u0026 hasFourWheels)\n    \tfmt.Println(isFast || hasFourWheels)\n\t\n\tif !isFast {\n\t\tfmt.Println(\"its slow!\")\n\t}\n\t\n\tif hasFourWheels {\n\t\tfmt.Println(\"its a car!\")\n\t}\n}\n```\n\n# Demo5 - Constants\nhttps://play.golang.org/p/wbNrNsk2YPd\n\n```\npackage main\n\nimport (\n\t\"fmt\"\n)\n\n//const maxValue //compile error\n\nconst population int = 10000\n\nfunc main() {\t\n\tconst name = \"CloudAcademy\"\n\t\n\t//name = \"Blah\" //compile error\n\t\n\tif true {\n\t\tconst color = \"red\"\n\n\t\tfmt.Println(population)\n\t\tfmt.Println(name)\n\t}\n\t\n\t//fmt.Println(color) //compile error\n}\n```\n\n# Demo6 - Control Flow - If\nhttps://play.golang.org/p/Fh4P5owNjvZ\n\n```\npackage main\n\nimport (\n\t\"fmt\"\n)\n\nfunc main() {\n\tvar population int = 5500\n\n\tif population \u003c 5000 {\n\t\tfmt.Println(\"small\")\n\t} else if population \u003e= 5000 \u0026\u0026 population \u003c 7000 {\n\t\tfmt.Println(\"medium\")\n\t} else {\n\t\tfmt.Println(\"large\")\n\t}\n\t\n\tif toggle := true; toggle {\n\t\tfmt.Println(\"its on!\")\n\t}\n}\n```\n\n# Demo7 - Control Flow - For\nhttps://play.golang.org/p/VFlocHBszR9\n\n```\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\tx := 0\n\ty := 0\n\n\tfor {\n\t\tif x++; x \u003e 2 {\n\t\t\tfmt.Println(x)\n\t\t\tbreak\n\t\t}\n\t}\n\n\tfor y \u003c 3 {\n\t\tfmt.Println(y)\n\t\ty++\n\t}\n\n\tfor z := 0; z \u003c 10; z++ {\n\t \tif z \u003c 8 {\n\t\t\tcontinue\n\t\t}\n\t\tfmt.Println(z)\n\t}\n}\n```\n\n# Demo8 - Control Flow - Switch\nhttps://play.golang.org/p/fQVXeX4JPKR\n\n```\npackage main\n\nimport (\n\t\"fmt\"\n)\n\nfunc main() {\n\tswitch signal := 1; signal {\n\tcase 0:\n\t\tfmt.Println(\"reg\")\n\tcase 1:\n\t\tfmt.Println(\"orange\")\n\tcase 2:\n\t\tfmt.Println(\"green\")\n\t}\n\n\tvar score int = 63\n\n\tswitch {\n\tcase score \u003c= 25:\n\t\tfmt.Println(\"beginner\")\n\tcase score \u003c= 75:\n\t\tfmt.Println(\"pro\")\n\tdefault:\n\t\tfmt.Println(\"expert\")\n\t}\n}\n```\n\n# Demo9 - Arrays\nhttps://play.golang.org/p/RbQu19MJ3Rl\n\n```\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\tvar arr1[4]int //init with 0s\n\tarr2 := [...]int{3, 1, 5, 10, 100} //compiler infers size of array\n\tfmt.Println(arr1)\n\tfmt.Println(arr2) \n\n\tfmt.Println(len(arr1)) //4\n\tfmt.Println(len(arr2)) //5\n\t\n\tfor _, value := range arr2 {\n\t\tfmt.Println(value)\n\t}\n\t\n\tarr1[0] = 10 //setting\n\t// arr1[4] = 1 // compile error - out of bounds\n\t\n\tfmt.Println(arr1)\n\tfmt.Println(arr1[0]) //getting\n\t\n\t//multidimensional\n\tarr3 := [2][2]string{\n\t\t{\"a1\", \"a2\"},\n\t\t{\"b1\", \"b2\"},\t//trailing comma is mandatory\n\t}\n\t\t\n\tfmt.Println(arr3)\n}\n```\n\n# Demo10 - Slices\nhttps://play.golang.org/p/HhYSSY0HsUP\n\n```\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\tarr1 := [6]int{1, 3, 5, 7, 11, 13}\n\tslice1 := []int{1, 3, 5, 7, 11, 13}\n\tslice2 := slice1[1:2]\n\tvar slice3 = make([]int, 2,3)\n\t\n\tfmt.Println(arr1)\n\tfmt.Println(slice1)\n\tfmt.Println(slice2)\n\tfmt.Println(slice3)\n\t\n\tslice3 = slice1[1:4]\n\t\t\n\tfmt.Println(slice3)\n\tfmt.Println(len(slice3))\n\t\n\tslice1 = append(slice1, 200, 300, 400)\n\tfmt.Println(slice1)\n\t\n\tslice2 = append(slice2, []int{7, 8, 9}...)\n\tfmt.Println(slice2)\n\t\n\tcopyslice := make([]int, len(slice1))\n    \tcopy(copyslice, slice1)\n\tfmt.Println(copyslice)\n}\n```\n\n# Demo11 - Maps\nhttps://play.golang.org/p/m4Rb7FMlMWm\n\n```\npackage main\n\nimport \"fmt\"\n\ntype player struct {\n\tid int\n\trank int\n}\n\nfunc main() {\n\tmap1 := make(map[string]string)\n\tmap1[\"key1\"] = \"value1\"\n\tmap1[\"key2\"] = \"value2\"\n\tmap1[\"key3\"] = \"value3\"\n\tfmt.Println(map1)\n\n\tvalue1 := map1[\"key1\"]\n\tfmt.Println(value1)\n\n\t//map1[\"key1\"] = 10 //compile error\n\tmap1[\"key1\"] = \"value1.1\"\n\tdelete(map1, \"key2\")\n\tmap1[\"newkey\"] = \"value4\"\n\tfmt.Println(map1)\n\n\tteam := map[string]player{\"John\": {3, 10}, \"Bob\": {14, 11}}\n\n\tfmt.Println(team)\n}\n```\n\n# Demo12 - Range\nhttps://play.golang.org/p/dkcKKqVsPAz\n\n```\npackage main\n\nimport \"fmt\"\n\ntype player struct {\n\tid   int\n\trank int\n}\n\nfunc main() {\t\n\tbytes := []int{67, 108, 111, 117, 100, 65, 99, 97, 100, 101, 109, 121}\n\tfor idx, value := range bytes {\n\t\tfmt.Print(string(value))\n\t\tif len(bytes)-1 == idx {\n\t\t\tfmt.Println()\n\t\t} \n\t}\n\n\tteam := map[string]player{\"John\": {3, 10}, \"Bob\": {14, 11}}\n\tfmt.Println(team)\n\n\tfor key, value := range team {\n\t\tfmt.Printf(\"%s -\u003e %d\\n\", key, value)\n\t}\n\n\tfor _, value := range team {\n\t\tfmt.Println(value)\n\t}\n\n\tfor key := range team {\n\t\tfmt.Println(\"key:\", key)\n\t}\n}\n```\n\n# Demo13 - Functions1\nhttps://play.golang.org/p/M3uE4qcghof\n\n```\npackage main\n\nimport \"fmt\"\n\nfunc sum(num1 int, num2 int) int {\n\tresult := num1 + num2\n\treturn result\n}\n\nfunc minus(num1, num2 int) (result int) {\n\tresult = num1 - num2\n\treturn\n}\n\nfunc main() {\n\tfmt.Println(sum(1, 2))\n\tfmt.Println(minus(10, 2))\n\n\tresult := func(num1 int, num2 int) int {\n\t\tsum := sum(num1, num2)\n\t\tminus := minus(num1, num2)\n\t\treturn sum * minus\n\t}(5, 3)\n\n\tfmt.Println(result)\n}\n```\n\n# Demo14 - Functions2\nhttps://play.golang.org/p/s6oqvLIt0Fu\n\n```\npackage main\n\nimport \"fmt\"\n\nfunc displayCount(id int, letters ...string) {\n\tcount := 0\n\tfor range letters {\n\t\tcount++\n\t}\n\n\t//display id, letters count, letters type, and letters content\n\tfmt.Printf(\"%d - %d - %T - %s\\n\", id, count, letters, letters)\n}\n\nfunc main() {\n\tdisplayCount(1, \"c\", \"l\", \"o\", \"u\", \"d\")\n\tdisplayCount(2, \"a\", \"c\", \"a\", \"d\", \"e\", \"m\", \"y\")\n\t\n\tcloud := []string{\"d\", \"e\", \"v\", \"o\", \"p\", \"s\"}\n\tdisplayCount(3, cloud...)\n}\n```\n\n# Demo15 - Functions3\nhttps://play.golang.org/p/4m7ycYNhgHW\n\n```\npackage main\n\nimport \"fmt\"\nimport \"errors\"\n\nfunc divide(num1 int, num2 int) (int, error) {\n\tif num2 == 0 {\n\t\treturn 0, errors.New(\"division by zero not allowed\")\n\t} else {\n\t\treturn (num1 / num2), nil\n\t}\n}\n\nfunc main() {\t\n\tif result, err := divide(10, 2); err != nil {\n\t\tfmt.Println(err)\n\t} else {\n\t\tfmt.Println(result)\n\t}\n}\n```\n\n# Demo16 - Functions4\nhttps://play.golang.org/p/bF6tTSjD9Hj\n\n```\npackage main\n\nimport \"fmt\"\n\nfunc extend(val string) func() string {\n\ti := 0\n\treturn func() string {\n\t\ti++\n\t\treturn val[:i]\n\t}\n}\n\nfunc main() {\n\tca := \"cloudacademy\"\n\t\n\tword := extend(ca)\n\n\tfor i := 0; i \u003c len(ca); i++ {\n\t\tfmt.Println(word())\n\t}\n}\n```\n\n# Demo17 - Structs\nhttps://play.golang.org/p/JVqtTjr-paO\n\n```\npackage main\n\nimport \"fmt\"\n\ntype person struct {\n\tfirstname string\n\tsurname   string\n}\n\ntype lecture struct {\n\tname       string\n\tinstructor person\n\tduration   int //seconds\n}\n\nfunc main() {\n\tlectures := []lecture{\n\t\tlecture{\"Structs\", person{\"Jeremy\", \"Cook\"}, 300},\n\t\tlecture{\"Pointers\", person{\"Jeremy\", \"Cook\"}, 300},\n\t\tlecture{\"Functions\", person{\"Jeremy\", \"Cook\"}, 300},\n\t}\n\n\tfor _, lecture := range lectures {\n\t\tname := lecture.name\n\t\tinstructor := fmt.Sprintf(\"%s %s\",\n\t\t\tlecture.instructor.firstname,\n\t\t\tlecture.instructor.surname)\n\t\tduration := lecture.duration\n\n\t\tfmt.Printf(\"Lecture: '%s', Author: %s, Duration: %d secs\\n\", name, instructor, duration)\n\t}\n\n}\n```\n\n# Demo18 - Pointers1\nhttps://play.golang.org/p/9E__12qzYLx\n\n```\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\tvar num1 int = 100\n\tvar num2 int = 200\n\tvar str1 string = \"blah\"\n\n\tvar ptr1 *int = \u0026num1\n\t//var ptr1 *int = \u0026str1 //compile error\n\n\tfmt.Printf(\"mem address of num1 is %p\\n\", \u0026num1)\n\tfmt.Printf(\"mem address of num2 is %p\\n\", \u0026num2)\n\tfmt.Printf(\"mem address of str1 is %p\\n\", \u0026str1)\n\n\tfmt.Printf(\"ptr1 points to mem address %p\\n\", ptr1)\n\n\t*ptr1 = 101\n\tfmt.Println(num1)\n\n\tptr1 = \u0026num2\n\tfmt.Printf(\"ptr1 points to mem address %p\\n\", ptr1)\n\tfmt.Println(*ptr1)\n\t\n\tptr2 := new(int)\n\tptr2 = ptr1\n\tfmt.Println(*ptr2)\n}\n```\n\n# Demo19 - Pointers2\nhttps://play.golang.org/p/pjvwKMhfoFq\n\n```\npackage main\n\nimport \"fmt\"\n\nfunc notString(msg string) {\n\tmsg = fmt.Sprintf(\"not%s\", msg)\n}\n\nfunc notStringPtr(msg *string) {\n\t*msg = fmt.Sprintf(\"not%s\", *msg)\n}\n\nfunc main() {\n\tmessage := \"cloudacademy\"\n\n\tnotString(message)\n\tfmt.Println(message)\n\n\tnotStringPtr(\u0026message)\n\tfmt.Println(message)\n}\n```\n\n# Demo20 - Methods - Structs\nhttps://play.golang.org/p/L8p6DdQAukd\n\n```\npackage main\n\nimport \"fmt\"\n\ntype person struct {\n\tfirstname string\n\tsurname   string\n\tage       int\n}\n\nfunc (p *person) fullname() string {\n\treturn p.firstname + \" \" + p.surname\n}\n\nfunc (p *person) canDrive() bool {\n\tif p.age \u003e= 20 {\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n\nfunc (p *person) updateAge(newAge int) {\n\tp.age = newAge\n}\n\nfunc main() {\n\tperson1 := person{\"John\", \"Doe\", 40}\n\tperson2 := person{\"Mark\", \"Doe\", 19}\n\n\tfmt.Printf(\"%s can drive: %t\\n\", person1.fullname(), person1.canDrive())\n\tfmt.Printf(\"%s can drive: %t\\n\", person2.fullname(), person2.canDrive())\n\t\n\tperson2.updateAge(person2.age + 1) //marks birthday\n\tfmt.Println(person2.age)\n\n\tfmt.Printf(\"%s can drive: %t\\n\", person2.fullname(), person2.canDrive())\n}\n```\n\n# Demo21 - Methods - Non-Struct\nhttps://play.golang.org/p/QCfTXx7TywI\n\n```\npackage main\n\nimport \"fmt\"\nimport \"strings\"\n\ntype upstring string\n\nfunc (msg upstring) up() string {\n\ts := string(msg)\n\treturn strings.ToUpper(s)\n}\n\nfunc main() {\n\tmessage := upstring(\"cloudacademy\")\n\tfmt.Println(message.up())\n}\n```\n\n# Demo22 - Interfaces\nhttps://play.golang.org/p/pbd99cSr9zA\n\n```\npackage main\n\nimport \"fmt\"\n\ntype device interface {\n\tturnOn() string\n}\n\ntype iphone struct {\n\tname string\n\tmodel string\n}\n\ntype imac struct {\n\tname string\n\tmodel string\n}\n\nfunc (phone iphone) turnOn() string {\n\treturn \"iOS starting up...\"\n}\n\nfunc (mac imac) turnOn() string {\n\treturn \"macOS starting up...\"\n}\n\nfunc main() {\n\tdev1 := iphone{\"iPhone\", \"11 Pro\"}\n\tdev2 := imac{\"iMac\", \"27 5k Retina\"}\n\t\n\tdevices := []device{dev1, dev2}\n\n\tfor _, dev := range devices {\n\t\tfmt.Println(dev.turnOn())\n\t}\n}\n```\n\n# Demo23 - Interfaces with Pointer based Receivers\nhttps://play.golang.org/p/bE6VdTNCuNu\n\n```\npackage main\n\nimport \"fmt\"\nimport \"strings\"\n\ntype device interface {\n\tturnOn() string\n\tupdate(version float32)\n}\n\ntype iphone struct {\n\tname    string\n\tmodel   string\n\tversion float32\n}\n\ntype imac struct {\n\tname    string\n\tmodel   string\n\tversion float32\n}\n\nfunc (phone iphone) turnOn() string {\n\treturn \"iOS starting up...\"\n}\n\nfunc (mac imac) turnOn() string {\n\treturn \"macOS starting up...\"\n}\n\nfunc (phone *iphone) update(version float32) {\n\tphone.version = version\n}\n\nfunc (mac *imac) update(version float32) {\n\tmac.version = version\n}\n\nfunc main() {\n\tdev1 := iphone{\"iPhone\", \"11 Pro\", 13.1}\n\tdev2 := imac{\"iMac\", \"27 5k Retina\", 10.15}\n\n\tdevices := []device{\u0026dev1, \u0026dev2}\n\n\tfor _, dev := range devices {\n\t\tif strings.Contains(dev.turnOn(), \"iOS\") {\n\t\t\tdev.update(14.0)\n\t\t} else if strings.Contains(dev.turnOn(), \"macOS\") {\n\t\t\tdev.update(11.00)\n\t\t}\n\t}\n\t\n\tfmt.Println(dev1)\n\tfmt.Println(dev2)\t\n}\n```\n\n# Demo24 - Errors\nhttps://play.golang.org/p/LskHt_O2E16\n\n```\npackage main\n\nimport \"fmt\"\nimport \"errors\"\nimport \"math\"\n\nfunc circleArea(radius float32) (float32, error) {\n\tif radius \u003c 0 {\n\t\treturn 0, errors.New(\"radius should be positive value\")\n\t} else {\n\t\treturn math.Pi * radius * radius, nil\n\t}\n}\n\nfunc main() {\n\tarea1, _ := circleArea(3)\n\tfmt.Println(area1)\n\n\tif area2, err := circleArea(-3); err != nil {\n\t\tfmt.Println(err)\n\t} else {\n\t\tfmt.Println(area2)\n\t}\n}\n```\n\n# Demo25 - Defer\nhttps://play.golang.org/p/kkyusUwavPD\n\n```\npackage main\n\nimport \"fmt\"\n\nfunc doSomething(msg string) {\n\tfmt.Println(msg)\n}\n\nfunc system() int {\n\tfmt.Println(\"system started...\")\n\n\tdefer doSomething(\"cleanup\")\n\tdefer doSomething(\"stop\")\n\t\n\tfmt.Println(\"system finished!\")\n\n\treturn 1\n}\n\nfunc main() {\n\tdata := system()\n\tfmt.Println(data)\n}\n```\n\n# Demo26 - Panic/Recover\nhttps://play.golang.org/p/9_Te0w76C2N\n\n```\npackage main\n\nimport \"fmt\"\n\nfunc system() int {\n\tfmt.Println(\"system started...\")\t\n\n\tdefer func(msg string) {\n\t\tif r := recover(); r != nil {\n\t\t\tfmt.Println(\"recovered\")\t\n\t\t}\n\t\tfmt.Println(msg)\n\t}(\"blah\")\n\n\tvar data []int\n\tvar x = data[0] //causes runtime spanic!\n\tx++\n\t\n\tfmt.Println(\"system finished!\")\n\n\treturn 1\n}\n\nfunc main() {\n\tdata := system()\n\tfmt.Println(data)\n\t\n\tpanic(\"die!\") //exits program with non-zero code\n}\n```\n\n# Demo27 - Goroutine1\nhttps://play.golang.org/p/8acvr_AJdgx\n\n```\npackage main\n\nimport (\n\t\"fmt\"\n\t\"math/rand\"\n\t\"time\"\n)\n\nfunc pause() {\n\tn := rand.Intn(3) // n will be between 0 and 3\n\ttime.Sleep(time.Duration(n) * time.Second)\n}\n\nfunc doSomething(msg string) {\n\tpause()\n\tfmt.Println(msg)\n}\n\nfunc main() {\n\trand.Seed(time.Now().Unix())\n\n\tdoSomething(\"sync1\")\n\n\tgo doSomething(\"async1\")\n\tgo doSomething(\"async2\")\n\tgo doSomething(\"async3\")\n\n\tdoSomething(\"sync2\")\n\t\n\ttime.Sleep(time.Second * 10)\n}\n```\n\n# Demo28 - Goroutine2\nhttps://play.golang.org/p/OjARMSo9w30\n\n```\npackage main\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n)\n\nfunc main() {\n\tvar wg sync.WaitGroup\n\t\n\twg.Add(1)\n\tgo func(msg string) {\n\t\tdefer wg.Done()\n\t\tfmt.Println(msg)\n\t}(\"cloud\")\n\n\twg.Add(1)\n\tgo func(msg string) {\n\t\tdefer wg.Done()\n\t\tfmt.Println(msg)\n\t}(\"academy\")\n\n\twg.Wait()\n}\n```\n\n# Demo29 - Channels\nhttps://play.golang.org/p/YJuyrFDWd_r\n\n```\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n\tmsgChan := make(chan string)\n\n\tgo func() {\t\n\t\tmsgChan \u003c- \"Cloud\"\n\t\tmsgChan \u003c- \"Academy\"\n\t\tmsgChan \u003c- \"2020\"\n\t}()\n\n\tmsg1 := \u003c-msgChan\n\tmsg2 := \u003c-msgChan\n\tmsg3 := \u003c-msgChan\n\t\n\tfmt.Println(msg1, msg2, msg3)\n}\n```\n\n# Demo30 - Channel Buffers\nhttps://play.golang.org/p/m4U5yWf6yKu\n\n```\npackage main\n\nimport \"time\"\n\nfunc main() {\n\tsize := 3\n\tvar buffChan = make(chan int, size)\n\n\t//reader\n\tgo func() {\n\t\tfor {\n\t\t\t_ = \u003c-buffChan\n\t\t\ttime.Sleep(time.Second)\n\t\t}\n\t}()\n\n\t//writer\n\twriter := func() {\n\t\tfor i := 1; i \u003c= 10; i++ {\n\t\t\tbuffChan \u003c- i\n\t\t\tprintln(i)\n\t\t}\n\t}\n\n\twriter()\n}\n```\n\n# Demo 31 - Channel Directions\nhttps://play.golang.org/p/onPjCfofMay\n\n```\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc in(channel chan\u003c- string, msg string) {\n \tchannel \u003c- msg\n}\n\nfunc out(channel \u003c-chan string) {\n\tfor {\n\t\tfmt.Println(\u003c-channel)\n\t}\n}\n\nfunc main() {\n\tchannel := make(chan string, 1)\n\n\tgo out(channel)\n\n\tfor i := 0; i \u003c 10; i++ {\n\t\tin(channel, fmt.Sprintf(\"cloudacademy - %d\", i))\n\t}\n\n\ttime.Sleep(time.Second * 10) //crude\n}\n```\n\n# Demo 32 - Channel Select\nhttps://play.golang.org/p/csPU3qa80Gl\n\n```\npackage main\n\nimport \"fmt\"\nimport \"math/rand\"\nimport \"time\"\n\nfunc pause() {\n\tn := rand.Intn(5) // n will be between 0 and 5\n\ttime.Sleep(time.Duration(n) * time.Second)\n}\n\nfunc func1(c chan\u003c- string) {\n\tfor {\n\t\tpause()\n\t\tc \u003c- \"cloud\"\n\t}\n}\n\nfunc func2(c chan\u003c- string) {\n\tfor {\n\t\tpause()\n\t\tc \u003c- \"academy\"\n\t}\n}\n\nfunc main() {\n\trand.Seed(time.Now().Unix())\n\n\tchan1 := make(chan string)\n\tchan2 := make(chan string)\n\n\tgo func1(chan1)\n\tgo func2(chan2)\n\n\tfor {\n\t\tselect {\n\t\tcase msg1 := \u003c-chan1:\n\t\t\tfmt.Println(msg1)\n\t\tcase msg2 := \u003c-chan2:\n\t\t\tfmt.Println(msg2)\n\t\t}\n\t}\n}\n```\n\n# Demo 33 - Channel Timeout\nhttps://play.golang.org/p/Zovrizw2ovR\n\n```\npackage main\n\nimport \"fmt\"\nimport \"time\"\n\nfunc main() {\n\tchannel := make(chan string)\n\n\tgo func(channel chan string) {\n\t\ttime.Sleep(5 * time.Second)\n\t\tchannel \u003c- \"cloudacademy\"\n\n\t}(channel)\n\n\tselect {\n\tcase msg1 := \u003c-channel:\n\t\tfmt.Println(msg1)\n\tcase \u003c-time.After(2 * time.Second):\n\t\tfmt.Println(\"Timeout!\")\n\t}\n}\n```\n\n# Demo 34 - Channel Close\nhttps://play.golang.org/p/LFzBy5xAJI7\n\n```\npackage main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n)\n\nfunc process(work \u003c-chan string, fin chan\u003c- string) {\n\tvar b bytes.Buffer\n\tfor {\t\t\n\t\tif msg, notClosed := \u003c-work; notClosed {\n\t\t\tfmt.Printf(\"%s received...\\n\", msg)\n\t\t\tb.WriteString(msg)\n\t\t} else {\n\t\t\tfmt.Println(\"channel closed\")\n\t\t\tfin \u003c- b.String()\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc main() {\n\twork := make(chan string, 3)\n\tfin := make(chan string)\n\n\tgo process(work, fin)\n\n\tword := \"cloudacademy\"\n\n\tfor j := 0; j \u003c len(word); j++ {\n\t\tletter := string(word[j])\n\t\twork \u003c- letter\n\t\tfmt.Printf(\"%s sent...\\n\", letter)\n\t}\n\n\tclose(work)\n\t\n\tfmt.Printf(\"result: %s\", \u003c-fin)\n}\n```\n\n# Demo 35 - Channel Range\nhttps://play.golang.org/p/-tvLMccbwgy\n\n```\npackage main\n\nimport \"fmt\"\n\nfunc squares() func() int {\n    var x int\n    return func() int {\n        x++\n        return x * x\n    }\n}\n\nfunc main() {\n\tf := squares()\n\tsquares := make(chan int, 20)\n\n\tfor i := f(); i \u003c= 100; i = f() {\n\t\tsquares \u003c- i\n\t}\n\n\tclose(squares)\n\n\tfor elem := range squares {\n\t\tfmt.Println(elem)\n\t}\n\n}\n```\n\n# Demo36 - Type Assertions - TypeSwitch\nhttps://play.golang.org/p/a94y6GfO24R\n\n```\npackage main\n\nimport \"fmt\"\n\ntype cloud interface {\n\tlaunch() string\n}\n\ntype aws struct {\n\tcomputeSvcName string\n}\n\ntype azure struct {\n\tcomputeSvcName string\n}\n\nfunc (cloud aws) launch() string {\n\treturn fmt.Sprintf(\"%s launching instance...\", cloud.computeSvcName)\n}\n\nfunc (cloud azure) launch() string {\n\treturn fmt.Sprintf(\"%s launching virtual machine...\", cloud.computeSvcName)\n}\n\nfunc compute(cloud interface{}) {\n\tswitch cloudplatform := cloud.(type) {\n\tcase aws:\n\t\taws := cloud.(aws) //casting\n\t\tfmt.Printf(\"AWS: %s -\u003e %s\\n\", aws, cloudplatform.launch()) //polymorphism\n\t\tbreak\n\tcase azure:\n\t\tazure := cloud.(azure) //casting\n\t\tfmt.Printf(\"Azure: %s -\u003e %s\\n\", azure, cloudplatform.launch()) //polymorphism\n\t\tbreak\n\t}\n}\n\nfunc main() {\n\tvar clouds []cloud = []cloud{\n\t\taws{\"ec2\"}, azure{\"vm\"},\n\t}\n\n\tfor _, cloud := range clouds {\n\t\tcompute(cloud)\n\t}\n\n}\n```\n\n# Demo37 - Empty Interface\nhttps://play.golang.org/p/RbGCSElwj9X\n\n```\npackage main\n\nimport \"fmt\"\n\ntype company struct {\n\tname string\n}\n\nfunc main() {\n\tvar a, b, c, d interface{}\n\n\ta = 42\n\tb = \"blah\"\n\tc = true\n\td = company{\"cloudadacademy\"}\n\n\tfunc(list ...interface{}) {\n\t\tfor _, v := range list {\n\t\t\tfmt.Printf(\"%v, %T\\n\", v, v)\n\t\t}\n\n\t}(a, b, c, d)\n}\n```\n\n# Demo38 - Type Assertions\nhttps://play.golang.org/p/8QVbrPMxwh4\n\n```\npackage main\n\nimport \"fmt\"\n\ntype company struct {\n\tname string\n}\n\nfunc main() {\n\tvar x interface{} = company{\"CloudAcademy\"}\n\n\tc1 := x.(company)\n\tfmt.Println(c1)\n\n\tif c2, ok := x.(company); ok {\n\t\tfmt.Println(c2, ok)\n\t}\n\n\t//n := x.(int); n++ //runtime panic\n}\n```\n\n# Demo39 - Scope - Shadowing\nhttps://play.golang.org/p/Zn130f09dQD\n\n```\n-- util.go --\npackage main\n\nvar x int = 11\n\n-- main.go --\npackage main\n\nimport \"fmt\"\n\nfunc print(id int, x int) {\n\tfmt.Printf(\"%d: x=%d\\n\", id, x)\n}\n\nfunc main() {\n\tprint(1, x)\n\t\n\tx := 2\n\n\tprint(2, x)\n\n\tfunc(x int){\n\t\tprint(3, x)\n\t\tif x := 3; x == 3 {\n\t\t\t//x := 100\n\t\t\tprint(4, x)\n\t\t}\n\t\tprint(5, x)\n\t}(5)\n\t\n\tprint(6, x)\n}\n```\n\n# Demo40 - Imports\nhttps://play.golang.org/p/_ewOM7JU8_K\n\n```\npackage main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"github.com/google/uuid\"\n)\n\nimport \"strconv\"\nimport m \"math\"\n\nfunc main() {\n\tname := \"cloudacademy\"\n\t\n\tfmt.Println(strings.ToUpper(name))\n\tfmt.Println(uuid.New())\n\tf, _ := strconv.ParseFloat(\"3.1415\", 64)\n\tfmt.Println(f)\n\tfmt.Println(m.Round(f))\n}\n```\n\n# Demo41 - Exports/Imports\nhttps://play.golang.org/p/Kmvd8-dNXMh\n\n```\n-- go.mod --\nmodule github.com/cloudacademy/go/mod/demo\n\n-- util/x.go --\npackage util\n\nconst X int = 100 //exported\nconst x int = 200 //unexported\n\n//exported\nfunc GetX() int {\n\treturn x\n}\n\n//unexported\nfunc getX() int {\n\treturn x\n}\n\n-- main.go --\npackage main\n\nimport (\n\t\"github.com/cloudacademy/go/mod/demo/util\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tfmt.Println(util.X)\n\t//fmt.Println(util.x) //compile failure - unexported\n\n\tfmt.Println(util.GetX())\n\t//fmt.Println(util.getX()) //compile failure - unexported\n\n}\n```\n\n# Demo42 - Package Visibility\nhttps://play.golang.org/p/2xzo2Ho9XiU\n\n```\n-- go.mod --\nmodule github.com/cloudacademy/go/mod/demo\n\n-- util/x.go --\npackage util\n\nconst X int = 100 //exported\nconst x int = 200 //unexported\n\n//exported\nfunc GetX() int {\n\treturn x\n}\n\n//exported\nfunc GetXY() int {\n\treturn x * getY() //visible due to being in same package\n}\n\n-- util/y.go --\npackage util\n\nconst y int = 300 //unexported\n\n//unexported\nfunc getY() int {\n\treturn y\n}\n\n-- main.go --\npackage main\n\nimport (\n\t\"github.com/cloudacademy/go/mod/demo/util\"\n\t\"fmt\"\n)\n\nfunc main() {\n\tfmt.Println(util.GetXY())\n\t\n\t//fmt.Println(util.getY()) //compile failure - unexported\n}\n```\n\n# Demo43 - Modules1\nhttps://play.golang.org/p/PZlq49vz59r\n\n```\n-- go.mod --\nmodule github.com/cloudacademy/go\n\nrequire github.com/google/uuid v1.1.1\n\n-- util/x.go --\npackage util\n\nconst x int = 100 //unexported\n\n//exported\nfunc GetX() int {\n\treturn x\n}\n\n-- util/y.go --\npackage util\n\nconst y int = 200 //unexported\n\n//exported\nfunc GetY() int {\n\treturn y\n}\n\n-- math/calc.go --\npackage math\n\nimport \"github.com/google/uuid\"\n\n//exported\nfunc Add(num1 int, num2 int) int {\n\treturn num1 + num2\n}\n\nfunc GetUuid() uuid.UUID {\n\treturn uuid.New()\n}\n\n-- main.go --\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/cloudacademy/go/util\"\n\t\"github.com/cloudacademy/go/math\"\n)\n\nfunc main() {\n\tx := util.GetX()\n\ty := util.GetY()\n\n\tfmt.Println(x)\n\tfmt.Println(y)\n\n\tsum := math.Add(x, y)\n\tuuid := math.GetUuid()\n\n\tfmt.Println(sum)\n\tfmt.Println(uuid)\n}\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudacademy%2Flearn-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcloudacademy%2Flearn-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudacademy%2Flearn-go/lists"}