├── 00-resources ├── godoc.md └── igapi │ ├── echo │ └── echo.go │ ├── go.mod │ ├── go.sum │ └── http │ └── http.go ├── 01-main └── main.go ├── 02-variables ├── const.go └── var.go ├── 03-if-else-switch ├── if.go └── switch.go ├── 04-function ├── func.go └── func_value.go ├── 05-package └── igapp │ ├── go.mod │ ├── main.go │ ├── time │ └── time.go │ └── user │ └── user.go ├── 06-arrays └── array.go ├── 07-slices ├── slice.go ├── slice_zero.go └── slicing.go ├── 08-loop └── loop.go ├── 09-maps └── map.go ├── 10-pointer └── pointer.go ├── 11-struct └── struct.go ├── 12-method └── method.go ├── 13-interface └── interface.go ├── 14-errors └── errors.go └── README.md /00-resources/godoc.md: -------------------------------------------------------------------------------- 1 | # godoc 2 | 3 | # command line 4 | ``` 5 | go doc fmt 6 | ``` 7 | ``` 8 | go doc fmt Printf 9 | ``` 10 | 11 | #install 12 | ``` 13 | go get -v golang.org/x/tools/cmd/godoc 14 | ``` 15 | 16 | #start web document 17 | ``` 18 | godoc -http :6060 19 | ``` 20 | 21 | -------------------------------------------------------------------------------- /00-resources/igapi/echo/echo.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "log" 5 | "net/http" 6 | "strings" 7 | 8 | "github.com/labstack/echo" 9 | "github.com/labstack/echo/middleware" 10 | ) 11 | 12 | type User struct { 13 | Username string `json:"username"` 14 | FullName string `json:"full_name"` 15 | ProfilePicUrl string `json:"profile_pic_url"` 16 | } 17 | 18 | var u1 = User{ 19 | Username: "golang", 20 | FullName: "Gopher", 21 | ProfilePicUrl: "https://knowhere.fake/gopher.jpg", 22 | } 23 | var u2 = User{ 24 | Username: "golang-way", 25 | FullName: "go away", 26 | ProfilePicUrl: "https://knowhere.fake/go-away.jpg", 27 | } 28 | 29 | var u3 = User{ 30 | Username: "python", 31 | FullName: "Pythonistas", 32 | ProfilePicUrl: "https://knowhere.fake/python.jpg", 33 | } 34 | var u4 = User{ 35 | Username: "Javascript", 36 | FullName: "Use me for everythings", 37 | ProfilePicUrl: "https://knowhere.fake/js.jpg", 38 | } 39 | 40 | var allUsers = []User{u1, u2, u3, u4} 41 | 42 | func usersHandler(c echo.Context) error { 43 | f := c.QueryParam("filter") 44 | if f == "" { 45 | err := c.JSON(http.StatusOK, allUsers) 46 | return err 47 | } 48 | 49 | var users []User 50 | for _, u := range allUsers { 51 | if strings.Contains(u.Username, f) { 52 | users = append(users, u) 53 | } 54 | } 55 | 56 | return c.JSON(http.StatusOK, users) 57 | } 58 | 59 | func main() { 60 | e := echo.New() 61 | e.Use(middleware.Logger()) 62 | 63 | e.GET("/users", usersHandler) 64 | 65 | port := "2021" 66 | log.Println("starting... port:", port) 67 | log.Fatal(e.Start(":" + port)) 68 | } 69 | -------------------------------------------------------------------------------- /00-resources/igapi/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/anuchito/igapi 2 | 3 | go 1.16 4 | 5 | require ( 6 | github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect 7 | github.com/labstack/echo v3.3.10+incompatible 8 | github.com/labstack/gommon v0.3.0 // indirect 9 | github.com/stretchr/testify v1.7.0 // indirect 10 | github.com/valyala/fasttemplate v1.2.1 // indirect 11 | golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e // indirect 12 | ) 13 | -------------------------------------------------------------------------------- /00-resources/igapi/go.sum: -------------------------------------------------------------------------------- 1 | github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 2 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 3 | github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= 4 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 5 | github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= 6 | github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= 7 | github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= 8 | github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= 9 | github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= 10 | github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 11 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 12 | github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= 13 | github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= 14 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 15 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 16 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 17 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 18 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 19 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 20 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= 21 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 22 | github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= 23 | github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= 24 | github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= 25 | golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e h1:8foAy0aoO5GkqCvAEJ4VC4P3zksTg4X4aJCDpZzmgQI= 26 | golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= 27 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= 28 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 29 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 30 | golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 31 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= 32 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 33 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 34 | golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= 35 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 36 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 37 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 38 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 39 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= 40 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 41 | -------------------------------------------------------------------------------- /00-resources/igapi/http/http.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "log" 6 | "net/http" 7 | "strings" 8 | ) 9 | 10 | type User struct { 11 | Username string `json:"username"` 12 | FullName string `json:"full_name"` 13 | ProfilePicUrl string `json:"profile_pic_url"` 14 | } 15 | 16 | var allUsers = []User{ 17 | { 18 | Username: "golang", 19 | FullName: "Gopher", 20 | ProfilePicUrl: "https://knowhere.fake/gopher.jpg", 21 | }, 22 | { 23 | Username: "golang-way", 24 | FullName: "go away", 25 | ProfilePicUrl: "https://knowhere.fake/go-away.jpg", 26 | }, 27 | { 28 | Username: "python", 29 | FullName: "Pythonistas", 30 | ProfilePicUrl: "https://knowhere.fake/python.jpg", 31 | }, 32 | { 33 | Username: "Javascript", 34 | FullName: "Use me for everythings", 35 | ProfilePicUrl: "https://knowhere.fake/js.jpg", 36 | }, 37 | } 38 | 39 | func usersHandler(w http.ResponseWriter, r *http.Request) { 40 | log.Println("users handler ", r.Method, r.URL) 41 | if r.Method == http.MethodGet { 42 | var q = r.URL.Query() 43 | f := q.Get("filter") 44 | 45 | if f == "" { 46 | w.Header().Set("content-type", "application/json") 47 | w.WriteHeader(http.StatusOK) 48 | json.NewEncoder(w).Encode(allUsers) 49 | return 50 | } 51 | 52 | var users []User 53 | for _, u := range allUsers { 54 | if strings.Contains(u.Username, f) { 55 | users = append(users, u) 56 | } 57 | } 58 | 59 | w.Header().Set("content-type", "application/json") 60 | w.WriteHeader(http.StatusOK) 61 | json.NewEncoder(w).Encode(users) 62 | 63 | } else { 64 | msg := http.StatusText(http.StatusMethodNotAllowed) 65 | http.Error(w, msg, http.StatusMethodNotAllowed) 66 | } 67 | } 68 | 69 | func main() { 70 | http.HandleFunc("/users", usersHandler) 71 | 72 | port := "2021" 73 | log.Println("starting... port:", port) 74 | log.Fatal(http.ListenAndServe(":"+port, nil)) 75 | } 76 | -------------------------------------------------------------------------------- /01-main/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | fmt.Println("hello Gopher!!!") 7 | fmt.Printf("hello %d!!!\n", 66) 8 | 9 | fmt.Printf("hello %v!!!!\n", "Gopher") 10 | 11 | fmt.Printf("hello %v : %v!!!!\n", "Gopher เด้อครับ", 66) 12 | } 13 | -------------------------------------------------------------------------------- /02-variables/const.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | const ( 7 | Sunday = iota 8 | Monday 9 | Tuesday 10 | Wednesday 11 | Thursday 12 | Friday 13 | Saturday 14 | ) 15 | 16 | fmt.Println("Sunday :", Sunday) 17 | fmt.Println("Monday :", Monday) 18 | fmt.Println("Tuesday :", Tuesday) 19 | fmt.Println("Wednesday :", Wednesday) 20 | fmt.Println("Thursday :", Thursday) 21 | fmt.Println("Friday :", Friday) 22 | fmt.Println("Saturday :", Saturday) 23 | } 24 | -------------------------------------------------------------------------------- /02-variables/var.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | /* 6 | The zero value is: 7 | 0 for numeric types, 8 | false for the boolean type 9 | "" (the empty string) for strings. 10 | */ 11 | 12 | /* basic type 13 | bool 14 | 15 | string 16 | 17 | int int8 int16 int32 int64 18 | uint uint8 uint16 uint32 uint64 uintptr 19 | 20 | byte // alias for uint8 21 | 22 | rune // alias for int32 23 | // represents a Unicode code point 24 | 25 | float32 float64 26 | 27 | complex64 complex128 28 | */ 29 | 30 | func main() { 31 | var name string 32 | s := "Gopher นำแน่!!!" 33 | i := 5 34 | f := 3.7 35 | b := true 36 | r := '界' 37 | 38 | fmt.Printf("name: %q\n", name) 39 | fmt.Printf("type: %T\n", name) 40 | 41 | fmt.Printf("int: %v\n", i) 42 | fmt.Printf("float64: %v\n", f) 43 | fmt.Printf("bool: %v\n", b) 44 | fmt.Printf("string: %v\n", s) 45 | fmt.Printf("rune: %v\n", r) 46 | 47 | } 48 | -------------------------------------------------------------------------------- /03-if-else-switch/if.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | num := 33 7 | 8 | if num%2 == 0 { 9 | fmt.Println("เลขคู่") 10 | } else if num == 31 { 11 | fmt.Println("คนมีคู่ไม่รู้หรอก") 12 | } else { 13 | fmt.Println("เลขโสด") 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /03-if-else-switch/switch.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | ) 7 | 8 | func main() { 9 | today := time.Monday 10 | 11 | switch today { 12 | case time.Monday: 13 | fmt.Println("today is Monday") 14 | fallthrough 15 | case time.Saturday, time.Sunday: 16 | fmt.Println("It's the weekend") 17 | default: 18 | fmt.Printf("สวัสดีวัน %v อยู่ดีมีแฮงเดย์\n", today) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /04-function/func.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func info(name, msg string, age int) { 6 | fmt.Printf("My name is %s\n", name) 7 | fmt.Printf("My message is %s\n", msg) 8 | fmt.Printf("I'm %d year old\n", age) 9 | } 10 | 11 | func today() string { 12 | return "มื้อนี่" 13 | } 14 | 15 | func swap(x, y string) (string, string) { 16 | return y, x 17 | } 18 | 19 | func main() { 20 | info("Gopher", "gopher เด้อ", 11) 21 | info("Nong", "ซ่ำบายดี", 15) 22 | 23 | day := today() 24 | fmt.Println(day) 25 | 26 | a, b := swap("ซำบายดี", "Gopher") 27 | fmt.Println(a, b) 28 | } 29 | -------------------------------------------------------------------------------- /04-function/func_value.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func show(name string) { 6 | fmt.Printf("value: %v\n", name) 7 | } 8 | 9 | func cal(op func(int, int) int) { 10 | r := op(3, 4) 11 | fmt.Println("result =", r) 12 | } 13 | 14 | func main() { 15 | var name = "Nong" 16 | fmt.Printf("value: %v\n", name) 17 | fmt.Printf("type: %T\n", name) 18 | show(name) 19 | fmt.Println() 20 | 21 | var plus = func(a int, b int) int { 22 | return a + b 23 | } 24 | 25 | p := plus(1, 2) 26 | fmt.Println("1+2 =", p) 27 | fmt.Printf("type: %T\n", plus) 28 | 29 | var minus = func(a int, b int) int { 30 | return a - b 31 | } 32 | cal(minus) 33 | } 34 | -------------------------------------------------------------------------------- /05-package/igapp/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/anuchito/igapp 2 | 3 | go 1.16 4 | -------------------------------------------------------------------------------- /05-package/igapp/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/anuchito/igapp/time" 7 | "github.com/anuchito/igapp/user" 8 | ) 9 | 10 | func main() { 11 | user.Info("Nong", "โกเฟอร์", 15) 12 | 13 | t := time.Today() 14 | fmt.Println("today is ", t) 15 | } 16 | -------------------------------------------------------------------------------- /05-package/igapp/time/time.go: -------------------------------------------------------------------------------- 1 | package time 2 | 3 | func Today() string { 4 | return "มื้อนี้" 5 | } 6 | -------------------------------------------------------------------------------- /05-package/igapp/user/user.go: -------------------------------------------------------------------------------- 1 | package user 2 | 3 | import "fmt" 4 | 5 | func Info(name string, msg string, age int) { 6 | fmt.Printf("My name is %s\n", name) 7 | fmt.Printf("My message is %s\n", msg) 8 | fmt.Printf("I'm %d year old\n", age) 9 | } 10 | -------------------------------------------------------------------------------- /06-arrays/array.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func showAll(ns [4]string) { 6 | fmt.Printf("show all : %#v\n", ns) 7 | } 8 | 9 | func main() { 10 | var langs = [4]string{"golang", "python", "javascript"} 11 | fmt.Printf("langs: %#v\n", langs) 12 | 13 | n := langs[1] 14 | fmt.Printf("%#v\n", n) 15 | 16 | langs[1] = "Pythonistas" 17 | fmt.Printf("%#v\n", langs) 18 | 19 | showAll(langs) 20 | 21 | cords := [4]string{"Am", "Gm", "F7-11"} 22 | showAll(cords) 23 | } 24 | -------------------------------------------------------------------------------- /07-slices/slice.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | langs := []string{"golang", "python", "javascript"} 7 | fmt.Printf("langs: %#v\n", langs) 8 | 9 | n := langs[0] 10 | fmt.Printf("langs[0]: %#v\n", n) 11 | 12 | langs[1] = "Pythonistas" 13 | fmt.Printf("langs: %#v\n", langs) 14 | 15 | l := len(langs) 16 | fmt.Println("length of langs :", l) 17 | 18 | langs = append(langs, "F#", "Em", "Am") 19 | fmt.Printf("langs: %#v\n", langs) 20 | 21 | fmt.Println("length of langs :", len(langs)) 22 | 23 | } 24 | -------------------------------------------------------------------------------- /07-slices/slice_zero.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | langs := []string{} 7 | fmt.Printf("langs : %#v\n", langs) 8 | 9 | if langs == nil { 10 | fmt.Println(`Yes nil "langs" is a nil slices`) 11 | } else { 12 | fmt.Printf("langs is NOT nil, value: %#v\n", langs) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /07-slices/slicing.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | langs := []string{"golang", "python", "javascript"} 7 | fmt.Printf("langs: %#v\n", langs) 8 | 9 | a := langs[0:2] // [0, 2) 10 | fmt.Printf("a : %#v\n", a) 11 | fmt.Printf("langs: %#v\n", langs) 12 | 13 | b := langs[1:3] // [1, 3) 14 | fmt.Printf("b : %#v\n", b) 15 | fmt.Printf("langs: %#v\n", langs) 16 | 17 | n := langs[0:len(langs)] 18 | fmt.Printf("n : %#v\n", n) 19 | fmt.Printf("langs: %#v\n", langs) 20 | 21 | r := langs[0:3] 22 | s := langs[:3] 23 | t := langs[0:] 24 | u := langs[:] 25 | 26 | fmt.Printf("r : %#v\n", r) 27 | fmt.Printf("s : %#v\n", s) 28 | fmt.Printf("t : %#v\n", t) 29 | fmt.Printf("u : %#v\n", u) 30 | 31 | printSlice(langs) 32 | cords := [4]string{"Am", "B", "G", "F#"} 33 | printSlice(cords[:]) 34 | } 35 | 36 | func printSlice(ns []string) { 37 | fmt.Printf("printSlice : ns: %#v\n", ns) 38 | } 39 | -------------------------------------------------------------------------------- /08-loop/loop.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | langs := []string{"golang", "python", "javascript", "F#"} 7 | fmt.Println("\nfor basic") 8 | for i := 0; i < len(langs); i++ { 9 | value := langs[i] 10 | fmt.Println(i, ":", value) 11 | } 12 | 13 | fmt.Println("\nfor range slice") 14 | for index, value := range langs { 15 | fmt.Println(index, ":", value) 16 | } 17 | 18 | fmt.Println("\nonly value") 19 | for _, value := range langs { 20 | fmt.Println("only value :", value) 21 | } 22 | 23 | fmt.Println("\nonly index") 24 | for index := range langs { 25 | fmt.Println("only index :", index) 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /09-maps/map.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | status := map[int]string{ 7 | 200: "OK", 8 | 308: "Permanent Redirect", 9 | 400: "Bad Request", 10 | 500: "Internal Server Error", 11 | } 12 | fmt.Printf("% #v\n", status) 13 | 14 | l := len(status) 15 | fmt.Printf("length: %d\n\n", l) 16 | 17 | status[200] = "Okie" 18 | status[285] = "เมาแน่เลย" 19 | fmt.Printf("% #v\n", status) 20 | fmt.Printf("length: %d\n\n", len(status)) 21 | 22 | key := 285 23 | delete(status, key) 24 | fmt.Printf("% #v\n", status) 25 | fmt.Printf("length: %d\n\n", len(status)) 26 | 27 | // var m map[string]string = make(map[string]string) // จองที่ mem ให้แล้ว ไม่ nil แล้ว 28 | // var m = make(map[string]string) 29 | // m := make(map[string]string) 30 | // m := map[string]string{} 31 | m := map[string]string{"ออเจ้า": "+66-978788997", "Steven": "+61-857985555"} 32 | 33 | if m == nil { 34 | fmt.Printf("m is nil. value : %#v\n", m) 35 | } else { 36 | fmt.Printf("m is not nil. value : %#v\n", m) 37 | } 38 | 39 | for key, value := range status { 40 | fmt.Printf("key: %d, value: %s\n", key, value) 41 | } 42 | fmt.Println() 43 | 44 | // omit key 45 | for _, value := range status { 46 | fmt.Printf("only value: %s\n", value) 47 | } 48 | fmt.Println() 49 | 50 | // omit value 51 | for key := range status { 52 | fmt.Printf("only key: %d\n", key) 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /10-pointer/pointer.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | me := "Gopher" 7 | fmt.Printf("You are %s\n", me) 8 | 9 | // var addr *string = &me 10 | addr := &me 11 | fmt.Println(addr) 12 | fmt.Printf("%T\n", addr) 13 | 14 | // อ่านค่าที่ addr ชึ้อยู่ 15 | v := *addr 16 | fmt.Println(v) 17 | 18 | // เป็นค่าที่ addr ชึ้อยู่ 19 | *addr = "Penguin" 20 | fmt.Printf("You are %s\n", me) 21 | } 22 | -------------------------------------------------------------------------------- /11-struct/struct.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | type User struct { 6 | Username string 7 | FullName string 8 | ProfilePicUrl string 9 | } 10 | 11 | func main() { 12 | username := "golang" 13 | fullName := "Basic Golang" 14 | profilePicUrl := "https://knowhere.fake/gopher.jpg" 15 | fmt.Println(username, fullName, profilePicUrl) 16 | 17 | u := User{ 18 | Username: username, 19 | FullName: fullName, 20 | ProfilePicUrl: profilePicUrl, 21 | } 22 | 23 | // u := User{} 24 | // u.Username = username 25 | // u.FullName = fullName 26 | // u.ProfilePicUrl = profilePicUrl 27 | 28 | fmt.Printf("%#v\n", u) 29 | 30 | fmt.Println(u.Username) 31 | fmt.Println(u.FullName) 32 | fmt.Println(u.ProfilePicUrl) 33 | 34 | } 35 | -------------------------------------------------------------------------------- /12-method/method.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | type User struct { 6 | Username string 7 | FullName string 8 | ProfilePicUrl string 9 | } 10 | 11 | func (u User) Info() { 12 | fmt.Printf("User name : %v\n", u.Username) 13 | fmt.Printf("Full name : %v\n", u.FullName) 14 | fmt.Printf("Profile Picture URL : %v\n", u.ProfilePicUrl) 15 | } 16 | 17 | func main() { 18 | u := User{ 19 | Username: "golang", 20 | FullName: "Basic Golang", 21 | ProfilePicUrl: "https://knowhere.fake/gopher.jpg", 22 | } 23 | 24 | // info(u) 25 | u.Info() 26 | } 27 | -------------------------------------------------------------------------------- /13-interface/interface.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | type Phone interface { 6 | Call(number string) 7 | } 8 | 9 | type Samsung struct { 10 | Name string 11 | } 12 | 13 | func (s Samsung) Call(number string) { 14 | fmt.Println(s.Name, "calling", number) 15 | } 16 | 17 | func (s Samsung) Answer() { 18 | fmt.Println(s.Name, "hello there!") 19 | } 20 | 21 | func Dial(p Phone) { 22 | p.Call("+6678787879") 23 | } 24 | 25 | func main() { 26 | s := Samsung{ 27 | Name: "S10", 28 | } 29 | 30 | s.Answer() 31 | s.Call("sss") 32 | 33 | Dial(s) 34 | } 35 | -------------------------------------------------------------------------------- /14-errors/errors.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | "log" 7 | ) 8 | 9 | func ReadFile(name string) (string, error) { 10 | // read file... 11 | return "", errors.New("file not found") 12 | } 13 | 14 | func main() { 15 | err := errors.New("file not found") 16 | fmt.Println(err) 17 | 18 | data, err := ReadFile("profile.txt") 19 | if err != nil { 20 | log.Println(err) 21 | return 22 | } 23 | 24 | fmt.Println("read file success :", data) 25 | 26 | } 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Introduction to Go programming 2 | 3 | Introduction to Go programming 4 | เนื้อหา Go programming พื้นฐานสำหรับ ผู้เริ่มต้น มือใหม่ เรียน Golang 5 | 6 | - [https://golang.org](https://golang.org) 7 | - [https://go.dev](https://go.dev) 8 | - [https://play.golang.org](https://play.golang.org) 9 | 10 | # How to run 11 | 12 | ``` 13 | go run .go 14 | ``` 15 | 16 | # เนื้อหา 17 | - [00-resources](00-resources) 18 | - [01-main](01-main) 19 | - [02-variables](02-variables) 20 | - [03-if-else-switch](03-if-else-switch) 21 | - [04-function](04-function) 22 | - [05-package](05-package) 23 | - [06-arrays](06-arrays) 24 | - [07-slices](07-slices) 25 | - [08-loop](08-loop) 26 | - [09-maps](09-maps) 27 | - [10-pointer](10-pointer) 28 | - [11-struct](11-struct) 29 | - [12-method](12-method) 30 | - [13-interface](13-interface) 31 | - [14-errors](14-errors) 32 | 33 | --------------------------------------------------------------------------------