Instalasi di #windows : - Windows 10 - Go versi 1.5 - Git Pastikan Go berjalan lancar, terutama untuk menjalankan perintah "go get" ... :) 1. Install gomobile dengan perintah go get golang.org/x/mobile/cmd/gomobile Keterangan : - proses ini akan menghasilkan gomobile.exe yang akan tersimpan di $GOPATH\bin - di windows, file exe ini tidak bisa langsung dijalankan secara global - jadi, harus diregister dulu ke environment variable-nya windows - kalo ngga mau capek ya copy aja ke folder project, hehe. 3. Pastikan command "gomobile" berjalan lancar jaya 2. Masuk ke folder yang ditentukan (bebas) 3. Lalu jalankan perintah "gomobile init", it might take a few minutes ... or hours ? T_T#go #golang #gomobile #android #go_andoid_tutor1_firstlook
script .go for k2, v2 := range v1 { fmt.Println(k2) fmt.Println(v2) } error : .\retrieve_mongo.go:92: cannot range over v1 (type interface {})Maka tinggal diubah seperti ini saja (type assertion) :
script .go for k2, v2 := range v1.(bson.M) { fmt.Println(k2) fmt.Println(v2) }Works like a charm .... #enlightenment #go
Dari kemaren sore, sampe dini hari ini dipusingkan sama arraynya #go. Bentuk seperti ini : [ [ {"title":"OK"} , {"title":"WELL"} ] ] tidak bisa langsung dikonsumsi sama contoh script di #ebook nya #addyosmani. Yang diinginkan adalah bentuk 2 objectnya langsung (up 1 level) yaitu : [ {"title":"OK"} , {"title":"WELL"} ] #problemsolve nya sementara ini di #go adalah, mengubah type struct ke type string#project
Nyoba compile ke windows 32 bit, semua berjalan lancar, kecuali CSS external yang tidak terload ... #error #go #project Padahal di 64 lancar jaya ... Issue yang mirip di stackoverflow
Ternyata go compiler bisa mengcompile lintas OS dan ARCH (arsitektur prosessor, 32 atau 64 bit). GO di komputer ane bermasalah saat akan melakukan kompilasi lintas OS dan ARCH, ini nyoba install ulang GO, dari sourcenya langsung, untuk itu perlu compiler gcc Petunjuknya#go #project
Misal saat ini saya sedang ada di folder Chat. Isi foldernya : /Chat : - main.go = package main - client.go = package main - room.go = package main dengan command berikut : go build -o chat.exe akan menghasilkan file chat.exe yang ready, hasilnya : /Chat : - main.go - client.go - room.go - chat.exe = Hasilnya catatan : "chat.exe" boleh diisi dengan nama apapun. Hasilnya nanti akan menjadi binary/executable
package config import( "encoding/json" "os" "fmt" ) var ( // Path // TemplatePath = "D:\\PROJECTS\\GO-APP\\sms.0.01\\templates\\" // PublicPath = "D:\\PROJECTS\\GO-APP\\sms.0.01\\public\\" UploadPath = "D:\\PROJECTS\\GO-APP\\sms.0.01\\public\\files\\" PDFPath = "D:\\PROJECTS\\GO-APP\\sms.0.01\\public\\pdf\\" ImagesLogoPath = "D:\\PROJECTS\\GO-APP\\sms.0.01\\public\\images\\depkeu.png" // PDF Generator | logo depkeu disposisi suratmasuk // Tahun Nomor Agenda TahunAgendaSMS = "2015" ) type Configuration struct { Port string TemplatePath string PublicPath string } func Port() string { file, _ := os.Open("C:\\DWConf\\config.json") decoder := json.NewDecoder(file) configuration := Configuration{} err := decoder.Decode(&configuration) if err != nil { fmt.Println("error:", err) } // fmt.Println() // output: [UserA, UserB] return configuration.Port } func TemplatePath() string { file, _ := os.Open("C:\\DWConf\\config.json") decoder := json.NewDecoder(file) configuration := Configuration{} err := decoder.Decode(&configuration) if err != nil { fmt.Println("error:", err) } return configuration.TemplatePath } func PublicPath() string { file, _ := os.Open("C:\\DWConf\\config.json") decoder := json.NewDecoder(file) configuration := Configuration{} err := decoder.Decode(&configuration) if err != nil { fmt.Println("error:", err) } return configuration.PublicPath }
Sebelum "tag" : [ { "created_by" : "auto", "created_from" : "::1", "nama" : "ARIEF YANUAR", "kode_jabatan" : "01", "nama_jabatan" : "Kepala Kantor Wilayah DJP Kalimantan Selatan dan Tengah", "nomor_agenda" : 2, "tanggal_disposisi" : "2015-04-29 10:03:21.7417571 +0800 SGT", "tanggal_terima" : "2015-04-29 10:03:21.7417571 +0800 SGT" } ], Planningnya "tag" : { "01" : { "created_by" : "auto", "created_from" : "::1", "nama" : "ARIEF YANUAR", "kode_jabatan" : "01", "nama_jabatan" : "Kepala Kantor Wilayah DJP Kalimantan Selatan dan Tengah", "nomor_agenda" : 2, "tanggal_disposisi" : "2015-04-29 10:03:21.7417571 +0800 SGT", "tanggal_terima" : "2015-04-29 10:03:21.7417571 +0800 SGT" } },
JAVASCRIPT { "kodejabatan":"01", "listsurat":[ { "Tanggal":"08/04/2015", "Asal":"KPP Pratama Banjarmasin", "Hal":"Laporan", "Nomor":"S-123/WPJ.29/KP.01/2015", "Tag": [{ "created_by":"auto", "kode_jabatan":"01", "nama":"MEKAR SATRIA UTAMA", "nama_jabatan":"Kepala Kantor Wilayah DJP Kalimantan Selatan dan Tengah", "nomor_agenda":1, "tanggal_disposisi":"2015-04-10 09:16:38.0569814 +0800 SGT", "tanggal_terima":"2015-04-10 09:16:38.0569814 +0800 SGT" }, { "created_by":"01", "kode_jabatan":"01.02", "nama":"MUH. ARIEF ZUSNIANTO", "nama_jabatan":"Kepala Bidang Dukungan Teknis dan Konsultasi", "nomor_agenda":1, "tanggal_disposisi":"2015-04-10 09:16:53.9328976 +0800 SGT" }, { "created_by":"01", "kode_jabatan":"01.04", "nama":"HENNY SUATRI SUARDI", "nama_jabatan":"Kepala Bidang Kerjasama dan Ekstensifikasi Perpajakan", "nomor_agenda":1, "tanggal_disposisi":"2015-04-10 09:35:56.3725057 +0800 SGT" }, { "created_by":"01", "kode_jabatan":"99", "nama":"%!s(\u003cnil\u003e)", "nama_jabatan":"Fungsional", "nomor_agenda":1, "tanggal_disposisi":"2015-04-10 09:41:45.4615867 +0800 SGT" }, { "created_by":"01", "kode_jabatan":"01.06", "nama":"\u003cnil\u003e", "nama_jabatan":"Kepala Bidang Pengurangan Keberatan dan Banding", "nomor_agenda":1, "tanggal_disposisi":"2015-04-10 09:43:13.1716407 +0800 SGT" }] ,"Doc_series":"BLw2DLPAM" } ], "username":"kakanwil" } INTERFACE{} GO {"kodejabatan":"01","listsurat":[{"Tanggal":"08/04/2015","Asal":"KPP Pratama Ban jarmasin","Hal":"Laporan","Nomor":"S-123/WPJ.29/KP.01/2015","Tag":[{"created_by" :"auto","kode_jabatan":"01","nama":"MEKAR SATRIA UTAMA","nama_jabatan":"Kepala K antor Wilayah DJP Kalimantan Selatan dan Tengah","nomor_agenda":1,"tanggal_dispo sisi":"2015-04-10 09:16:38.0569814 +0800 SGT","tanggal_terima":"2015-04-10 09:16 :38.0569814 +0800 SGT"},{"created_by":"01","kode_jabatan":"01.02","nama":"MUH. A RIEF ZUSNIANTO","nama_jabatan":"Kepala Bidang Dukungan Teknis dan Konsultasi","n omor_agenda":1,"tanggal_disposisi":"2015-04-10 09:16:53.9328976 +0800 SGT"},{"cr eated_by":"01","kode_jabatan":"01.04","nama":"HENNY SUATRI SUARDI","nama_jabatan ":"Kepala Bidang Kerjasama dan Ekstensifikasi Perpajakan","nomor_agenda":1,"tang gal_disposisi":"2015-04-10 09:35:56.3725057 +0800 SGT"},{"created_by":"01","kode _jabatan":"99","nama":"%!s(\u003cnil\u003e)","nama_jabatan":"Fungsional","nomor_ agenda":1,"tanggal_disposisi":"2015-04-10 09:41:45.4615867 +0800 SGT"},{"created _by":"01","kode_jabatan":"01.06","nama":"\u003cnil\u003e","nama_jabatan":"Kepala Bidang Pengurangan Keberatan dan Banding","nomor_agenda":1,"tanggal_disposisi": "2015-04-10 09:43:13.1716407 +0800 SGT"}],"Doc_series":"BLw2DLPAM"}],"username": "kakanwil"} Type ==> suratmasuk.Response aka interface{}dan masih menjadi mimpi buruk di #go, dengan type interface{} -nya #fyuuh #go
/* // JSON w.Header().Set("Content-Type", "application/json") fmt.Fprint(w, finalResult) return */#go
{{define "title"}} Home {{end}} {{define "username"}} {{.username}} {{end}} {{define "body"}} {{ $kodejabatan := .kodejabatan }} Input#project
<table border="1"> <thead> <th>Mode</th> <th colspan="2">Agenda</th> <th>Asal</th> <th>Nomor</th> <th>Tanggal</th> <th>Hal</th> </thead> {{ range .listsurat}} <tr> <td>Detail</td> {{ range .Tag}} {{ if eq .kode_jabatan $kodejabatan}} <td>{{.nomor_agenda}}</td> <td>{{.tanggal_disposisi | formatwaktu}}</td> {{ end }} {{ end }} <td>{{ .Asal}}</td> <td>{{ .Nomor}}</td> <td>{{ .Tanggal}}</td> <td>{{ .Hal}}</td> </tr> {{ end }} </table> {{end}}
switch r.Method { case "GET": // Serve the resource. case "POST": // Create a new record. case "PUT": // Update an existing record. case "DELETE": // Remove the record. default: // Give an error message. }#go #stackoverflow #reminder
package main import ( "fmt" "github.com/gorilla/mux" "github.com/gorilla/sessions" // "github.com/fzzy/radix/redis" // "github.com/fatih/structs" "net" "net/http" "html/template" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" "regexp" "strings" "crypto/rand" "time" "strconv" // "encoding/json" // "reflect" ) var ( // MongoDB mongoConfig = "mongodb://localhost:27017/admin" MongoSession, err = mgo.Dial(mongoConfig) MDB = MongoSession.DB("admin") BlogCol = MDB.C("blog") UserCol = MDB.C("user") // Session store = sessions.NewCookieStore([]byte("something-very-secret")) // Blog skipHome = 0 limit = 10 rowsNum = 10 // Tag Factory tagPattern = "#([a-z]|[A-Z]|[_])+" // Path templatePath = "D:\\PROJECTS\\GO-APP\\webkoe\\templates\\" publicPath = "D:\\PROJECTS\\GO-APP\\webkoe\\public\\" ) func cekKodeJabatan(r *http.Request) string { session,_ := store.Get(r, "session-name") kode_jabatan := fmt.Sprintf("%s", session.Values["kode_jabatan"]) return kode_jabatan } func SmsHomeHandler(w http.ResponseWriter, r *http.Request) { if cekKodeJabatan(r) == "" { http.Redirect(w, r, "/login", 301) fmt.Println(cekKodeJabatan(r)) fmt.Println("*** @home -> No Data ") }else{ templates := template.Must(template.New("").ParseFiles(templatePath + "sms-base.html", templatePath + "sms-home.html")) err := templates.ExecuteTemplate(w, "base", cekKodeJabatan(r)) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } } func SmsLoginFormHandler(w http.ResponseWriter, r *http.Request) { if cekKodeJabatan(r) == "" { templates := template.Must(template.New("").ParseFiles(templatePath + "sms-base.html", templatePath + "sms-loginform.html")) err := templates.ExecuteTemplate(w, "base", nil) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }else{ http.Redirect(w, r, "/", 301) } } func SmsPostLoginHandler(w http.ResponseWriter, r *http.Request) { if cekKodeJabatan(r) == "" { username := r.FormValue("username") password := r.FormValue("password") var results map[string]interface{} err = UserCol.Find(bson.M{"username": username, "password" : password}).One(&results) if err != nil { http.Redirect(w, r, "/#error", 301) }else{ kode_jabatan, _ := results["kode_jabatan"] session, _ := store.Get(r, "session-name") session.Values["kode_jabatan"] = kode_jabatan session.Save(r, w) http.Redirect(w, r, "/", 301) } }else{ http.Redirect(w, r, "/", 301) } } func SmsLogoutHandler(w http.ResponseWriter, r *http.Request) { session, _ := store.Get(r, "session-name") session.Values["kode_jabatan"] = "" session.Save(r, w) http.Redirect(w, r, "/", 301) } func safehtml(text string) template.HTML { text = text + " " text = strings.Replace(text, "<", "<", -1) text = strings.Replace(text, ">", ">", -1) text = strings.Replace(text, "#go #script", "", -1) text = strings.Replace(text, "
", "", -1) text = strings.Replace(text, "", "", -1) text = strings.Replace(text, "", "", -1) text = strings.Replace(text, "", "", -1) text = strings.Replace(text, "", "", -1) text = strings.Replace(text, "", "", -1) text = strings.Replace(text, "=", "=", -1) text = strings.Replace(text, "<a href=", "", "", -1) text = strings.Replace(text, "<img src=", "", ">", -1) regexPagar, _ := regexp.Compile(tagPattern) tags := regexPagar.FindAllString(text, -1) for _ , value := range tags { tagAscii := strings.Replace(value, "#", "#", 1) tagOnly := strings.Replace(value, "#", "", 1) text = strings.Replace(text, value, "" + tagAscii + "", 1) } return template.HTML(text) } func timeFormatter(text string) template.HTML { text = strings.Replace(text, " ", "-", -1) text = strings.Replace(text, ":", "-", -1) split := strings.Split(text, "-") tahun, _ := strconv.Atoi(split[0]) bulan, _ := strconv.Atoi(split[1]) tanggal, _ := strconv.Atoi(split[2]) jam, _ := strconv.Atoi(split[3]) menit, _ := strconv.Atoi(split[4]) detik, _ := strconv.Atoi(split[5]) var _bulan time.Month if bulan == 1 { _bulan = time.January }else if bulan == 2 { _bulan = time.February }else if bulan == 3{ _bulan = time.March }else if bulan == 4{ _bulan = time.April }else if bulan == 5{ _bulan = time.May }else if bulan == 6{ _bulan = time.June }else if bulan == 7{ _bulan = time.July }else if bulan == 8{ _bulan = time.August }else if bulan == 9{ _bulan = time.September }else if bulan == 10{ _bulan = time.October }else if bulan == 11{ _bulan = time.November }else if bulan == 12{ _bulan = time.December } // const layout = "Mon Jan 2, 2006 at 3:04pm (MST)" (MST) --> WITA const layout = "Mon, 2 Jan 2006 3:04 pm" t := time.Date(tahun, _bulan, tanggal, jam, menit, detik, 0, time.Local) return template.HTML(t.Format(layout)) } func randStr(strSize int, randType string) string { var dictionary string if randType == "alphanum" { dictionary = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" } if randType == "alpha" { dictionary = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" } if randType == "number" { dictionary = "0123456789" } var bytes = make([]byte, strSize) rand.Read(bytes) for k, v := range bytes { bytes[k] = dictionary[v%byte(len(dictionary))] } return string(bytes) } func GetIP(r *http.Request) string { if ipProxy := r.Header.Get("X-FORWARDED-FOR"); len(ipProxy) > 0 { return ipProxy } ip, _, _ := net.SplitHostPort(r.RemoteAddr) return ip } func main() { mx := mux.NewRouter() // *** home *** mx.HandleFunc("/", SmsHomeHandler) // *** login *** mx.HandleFunc("/login", SmsLoginFormHandler).Methods("GET") mx.HandleFunc("/login", SmsPostLoginHandler).Methods("POST") // *** logout *** mx.HandleFunc("/logout", SmsLogoutHandler).Methods("GET") // *** static server *** mx.PathPrefix("/").Handler(http.FileServer(http.Dir( publicPath ))) http.ListenAndServe(":80", mx) }
func safehtml(text string) template.HTML { text = text + " " text = strings.Replace(text, "<", "<", -1) text = strings.Replace(text, ">", ">", -1) text = strings.Replace(text, "dan ini yang memanggil", "", -1) regexPagar, _ := regexp.Compile(tagPattern) tags := regexPagar.FindAllString(text, -1) for _ , value := range tags { tagAscii := strings.Replace(value, "#", "#", 1) tagOnly := strings.Replace(value, "#", "", 1) text = strings.Replace(text, value, "" + tagAscii + "", 1) } return template.HTML(text) }", -1) text = strings.Replace(text, "", "
func WkListHandler(w http.ResponseWriter, r *http.Request) { funcMap := template.FuncMap{ "safehtml": safehtml , } templates := template.Must(template.New("").Funcs(funcMap).ParseFiles(templatePath + "webkoe-base.html", templatePath + "webkoe-list.html")) var results []Blog err = MCol.Find(bson.M{}).Sort("-date").Limit(1000000000000).All(&results) if err != nil { panic(err) } // var finalResult []tagView // fmt.Println(reflect.TypeOf(results)) err := templates.ExecuteTemplate(w, "base", results) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }#script #webkoe #go #enlightenment #nice
- Ubuntu : Awal PATH="/root/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games" root@webkoe:~# export PATH=$PATH:/root/go/bin Menjadi PATH="/root/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/root/go/bin" - Windows : Awal Path=C:\Python27\;C:\Python27\Scripts;D:\oracle\product\11.1.0\db_1\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows; C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\PROJECTS\NODEAPP\Nodejs\;D:\PROJECTS\WEB\xampp\php; C:\Program Files\MongoDB 2.6 Standard\bin;C:\ProgramData\ComposerSetup\bin;C:\dart\dart-sdk\bin;D:\PROJECTS\GO\bin; C:\Program Files (x86)\Git\cmd;C:\Ruby21-x64\bin;C:\Users\lou\AppData\Roaming\npm C:\Users\lou>set PATH=%PATH%;D:\PROJECTS\GO\bin Menjadi Path=C:\Python27\;C:\Python27\Scripts;D:\oracle\product\11.1.0\db_1\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32; C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\PROJECTS\NODEAPP\Nodejs\;D:\PROJECTS\WEB\xampp\php; C:\Program Files\MongoDB 2.6 Standard\bin;C:\ProgramData\ComposerSetup\bin;C:\dart\dart-sdk\bin;D:\PROJECTS\GO\bin; C:\Program Files (x86)\Git\cmd;C:\Ruby21-x64\bin;C:\Users\lou\AppData\Roaming\npm;D:\PROJECTS\GO\bin#script #setting #go
Ane awalnya rumit sekali mikirnya ... syukurlah ketemu link ini http://stackoverflow.com/questions/17306358/golang-removing-fields-from-struct-or-hiding-them-in-json-response Ternyata cukup serahkan pada map[string]interface{}, sudah bisa kirim variable apapun, sepuasnya ke templates func WkTagViewHandler(w http.ResponseWriter, r *http.Request) { tagName := mux.Vars(r)["tag"] funcMap := template.FuncMap{ "safehtml": func(text string) template.HTML { text = text + " " text = strings.Replace(text, "&#60;", "<", -1) text = strings.Replace(text, ">", ">", -1) text = strings.Replace(text, "#webkoe #go #script", "", -1) regexPagar, _ := regexp.Compile(tagPattern) tags := regexPagar.FindAllString(text, -1) for _ , value := range tags { tagAscii := strings.Replace(value, "#", "#", 1) tagOnly := strings.Replace(value, "#", "", 1) text = strings.Replace(text, value, "" + tagAscii + "", 1) } return template.HTML(text) }, } templates := template.Must(template.New("").Funcs(funcMap).ParseFiles(templatePath + "webkoe-base.html", templatePath + "webkoe-tagview.html")) var results []Blog err = MCol.Find(bson.M{"tag": tagName}).Sort("-date").Limit(1000000000000).All(&results) if err != nil { panic(err) } finalResult := map[string]interface{}{ "tagName" : tagName, "tagList" : results, } err := templates.ExecuteTemplate(w, "base", finalResult) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }", -1) text = strings.Replace(text, "", "
package main import ( "fmt" "github.com/gorilla/mux" "github.com/gorilla/sessions" "github.com/fzzy/radix/redis" "net" "net/http" "html/template" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" "regexp" "strings" "crypto/rand" "time" // "reflect" ) var ( // MongoDB mongoConfig = "mongodb://***usermongo***:***passmongo***@localhost:***portmongo***/***dbmongo***" MongoSession, err = mgo.Dial(mongoConfig) MDB = MongoSession.DB("admin") MCol = MDB.C("blog") // Session store = sessions.NewCookieStore([]byte("something-very-secret")) // Tag Factory tagPattern = "#([a-z]|[A-Z])+" ) type Blog struct { Id string Things string Date string Ip string Agent string Tag []string } // type tagView struct { // tagName string // tagList []main.Blog // } func WkHomeHandler(w http.ResponseWriter, r *http.Request) { err := template.Must(template.ParseFiles("templates/webkoe-home.html")).Execute(w, nil) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func WkTagViewHandler(w http.ResponseWriter, r *http.Request) { tagName := mux.Vars(r)["tag"] funcMap := template.FuncMap{ "safehtml": func(text string) template.HTML { text = text + " " text = strings.Replace(text, "&&#35;60;", "<", -1) text = strings.Replace(text, ">", ">", -1) text = strings.Replace(text, "#script #go #webkoe", "", -1) regexPagar, _ := regexp.Compile(tagPattern) tags := regexPagar.FindAllString(text, -1) for _ , value := range tags { tagAscii := strings.Replace(value, "#", "#", 1) tagOnly := strings.Replace(value, "#", "", 1) text = strings.Replace(text, value, "" + tagAscii + "", 1) } return template.HTML(text) }, } templates := template.Must(template.New("").Funcs(funcMap).ParseFiles("templates/webkoe-base.html", "templates/webkoe-tagview.html")) var results []Blog err = MCol.Find(bson.M{"tag": tagName}).Sort("-date").Limit(1000000000000).All(&results) if err != nil { panic(err) } err := templates.ExecuteTemplate(w, "base", results) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func WkCreateHandler(w http.ResponseWriter, r *http.Request) { blog_id := randStr(7, "alphanum") session, _ := store.Get(r, "session-name") session.Values["blog_id"] = blog_id session.Save(r, w) templates := template.Must(template.New("").ParseFiles("templates/webkoe-base.html", "templates/webkoe-create.html")) err := templates.ExecuteTemplate(w, "base", blog_id) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func WkPostCreateHandler(w http.ResponseWriter, r *http.Request) { things := r.FormValue("things") thingsWithSpace := things + " " captcha := r.FormValue("captcha") session,_ := store.Get(r, "session-name") blog_id := fmt.Sprintf("%s", session.Values["blog_id"]) if things != "" { if captcha == blog_id { // Factory cariTag,_ := regexp.Compile(tagPattern) tagFound := cariTag.FindAllString(thingsWithSpace, -1) var tempTags []string for _, value := range tagFound { cleanRegex,_ := regexp.Compile("(#| )") cleanTag := cleanRegex.ReplaceAllString(value, "") tempTags = append(tempTags, cleanTag) } waktu := strings.Split(fmt.Sprint(time.Now()), ".")[0] ip := GetIP(r) agent := fmt.Sprint(r.Header["User-Agent"]) jsonBlog := &Blog{Id: blog_id, Things: things, Date: waktu, Ip: ip, Agent: agent, Tag: tempTags} err = MCol.Insert(jsonBlog) fmt.Println("Welcome, " + things + " " + thingsWithSpace) http.Redirect(w, r, "/#thanks", 301) }else{ fmt.Println("Robot ?") http.Redirect(w, r, "/#you_r_a_bots", 301) } }else{ http.Redirect(w, r, "/#empty", 301) } // fmt.Println("Someone POST " + things + " blog_id " + blog_id) // fmt.Println(blog_id) /* templates := template.Must(template.New("").ParseFiles("templates/webkoe-base.html", "templates/webkoe-create.html")) err := templates.ExecuteTemplate(w, "base", nil) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } */ } func WkListHandler(w http.ResponseWriter, r *http.Request) { funcMap := template.FuncMap{ "safehtml": func(text string) template.HTML { text = text + " " text = strings.Replace(text, "<", "<", -1) text = strings.Replace(text, ">", ">", -1) text = strings.Replace(text, "", -1) text = strings.Replace(text, "", "", "", -1) regexPagar, _ := regexp.Compile(tagPattern) tags := regexPagar.FindAllString(text, -1) for _ , value := range tags { tagAscii := strings.Replace(value, "#", "#", 1) tagOnly := strings.Replace(value, "#", "", 1) text = strings.Replace(text, value, "" + tagAscii + "", 1) } return template.HTML(text) }, } templates := template.Must(template.New("").Funcs(funcMap).ParseFiles("templates/webkoe-base.html", "templates/webkoe-list.html")) var results []Blog err = MCol.Find(bson.M{}).Sort("-date").Limit(1000000000000).All(&results) if err != nil { panic(err) } // var finalResult []tagView // fmt.Println(reflect.TypeOf(results)) err := templates.ExecuteTemplate(w, "base", results) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func CatatanHomeHandler(w http.ResponseWriter, r *http.Request) { var results []Blog err = MCol.Find(bson.M{}).Sort("-date").Limit(100).All(&results) if err != nil { panic(err) } err := template.Must(template.ParseFiles("templates/gorilla-catatanhome.html")).Execute(w, results) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func HomeWKSHandler(w http.ResponseWriter, r *http.Request) { err := template.Must(template.ParseFiles("templates/gorilla-home_wks.html")).Execute(w, nil) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func WkBlogHandler(w http.ResponseWriter, r *http.Request) { page := mux.Vars(r)["page"] err := template.Must(template.ParseFiles("templates/gorilla-blog.html")).Execute(w, map[string]string{"halaman": page}) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func WkRedisHandler(w http.ResponseWriter, r *http.Request) { // redis redisClient, _ := redis.Dial("tcp", "localhost:6379") news, _ := redisClient.Cmd("zrevrangebyscore", "news:republika:posttime", "+inf", "-inf", "limit", "0", "3").List() var bundleNews []string for _, elemStr := range news { bundleNews = append(bundleNews, elemStr) fmt.Println(bundleNews) } // render err := template.Must(template.ParseFiles("templates/gorilla-redis.html")).Execute(w, bundleNews) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func WkTestPassVarHandler(w http.ResponseWriter, r *http.Request) { err := template.Must(template.ParseFiles("templates/gorilla-blog.html")).Execute(w, map[string]string{"halaman": "2"}) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func randStr(strSize int, randType string) string { var dictionary string if randType == "alphanum" { dictionary = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" } if randType == "alpha" { dictionary = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" } if randType == "number" { dictionary = "0123456789" } var bytes = make([]byte, strSize) rand.Read(bytes) for k, v := range bytes { bytes[k] = dictionary[v%byte(len(dictionary))] } return string(bytes) } func GetIP(r *http.Request) string { if ipProxy := r.Header.Get("X-FORWARDED-FOR"); len(ipProxy) > 0 { return ipProxy } ip, _, _ := net.SplitHostPort(r.RemoteAddr) return ip } func main() { // MUX ROUTER mx := mux.NewRouter() // WEBKOE.NET // *** home *** mx.HandleFunc("/", WkListHandler).Host("webkoe.net") // *** tag *** mx.HandleFunc("/tag/{tag}", WkTagViewHandler).Host("webkoe.net").Methods("GET") // *** create *** mx.HandleFunc("/create", WkCreateHandler).Host("webkoe.net").Methods("GET") mx.HandleFunc("/create", WkPostCreateHandler).Host("webkoe.net").Methods("POST") // *** misc *** mx.HandleFunc("/test/pass_var", WkTestPassVarHandler).Host("webkoe.net") mx.HandleFunc("/redis", WkRedisHandler).Host("webkoe.net") mx.HandleFunc("/page/{page}", WkBlogHandler).Host("webkoe.net") mx.PathPrefix("/").Handler(http.FileServer(http.Dir("./public/"))).Host("webkoe.net") // CATATAN.WEBKOE.NET mx.HandleFunc("/", CatatanHomeHandler).Host("catatan.webkoe.net") // WEBKANSAJA.COM mx.HandleFunc("/", HomeWKSHandler).Host("webkansaja.com") http.ListenAndServe(":80", mx) }", -1) text = strings.Replace(text, "", "
package main import ( "github.com/go-martini/martini" "github.com/martini-contrib/render" "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" "net" "net/http" "fmt" "time" "crypto/rand" "strings" "regexp" ) // local var mongoConfig = "127.0.0.1:27017" var blogCollection = "webkoe_blog" var hostHome = "localhost:8080" var hostCatatan = "catatan" // webkoe // var mongoConfig = "mongodb://usermongo:passmongo@localhost:portmongo/dbmongo" // var blogCollection = "blog" // var hostHome = "webkoe.net:8080" // var hostCatatan = "catatan.webkoe.net" type Blog struct { Id string Things string Date string Ip string Agent string Tag []string } func GetIP(r *http.Request) string { if ipProxy := r.Header.Get("X-FORWARDED-FOR"); len(ipProxy) > 0 { return ipProxy } ip, _, _ := net.SplitHostPort(r.RemoteAddr) return ip } func randStr(strSize int, randType string) string { var dictionary string if randType == "alphanum" { dictionary = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" } if randType == "alpha" { dictionary = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" } if randType == "number" { dictionary = "0123456789" } var bytes = make([]byte, strSize) rand.Read(bytes) for k, v := range bytes { bytes[k] = dictionary[v%byte(len(dictionary))] } return string(bytes) } func main() { // MARTINI m := martini.Classic() m.Use(render.Renderer(render.Options{ Layout: "layout", })) // MONGODB session, err := mgo.Dial(mongoConfig) if err != nil { panic(err) } defer session.Close() session.SetMode(mgo.Monotonic, true) webkoe_blog := session.DB("admin").C(blogCollection) // ROUTER m.Get("/", func(r render.Render, req *http.Request) { if req.Host == hostHome { r.HTML(200, "home", req.Host) }else if req.Host == hostCatatan { r.HTML(200, "home-catatan", req.Host) } }) m.Get("/blog", func(r render.Render) { var results []Blog err = webkoe_blog.Find(bson.M{}).Sort("-date").Limit(100).All(&results) if err != nil { panic(err) } // fmt.Println(results) r.HTML(200, "blog", results) }) m.Post("/blog", func(req *http.Request, r render.Render){ things := req.FormValue("things") + " " // tag regex, err := regexp.Compile("#([a-z])+ ") remove, err := regexp.Compile("(#| )") tags := regex.FindAllString(things, -1) // fmt.Println(tags) // modify semua listA var modTags []string for _, value := range tags { final := remove.ReplaceAllString(value, "") modTags = append(modTags, final) } // fmt.Println(modTags) waktu := strings.Split(fmt.Sprint(time.Now()), ".")[0] blog_id := randStr(7, "alphanum") ip := GetIP(req) agent := fmt.Sprint(req.Header["User-Agent"]) jsonBlog := &Blog{Id: blog_id, Things: things, Date: waktu, Ip: ip, Agent: agent, Tag: modTags} err = webkoe_blog.Insert(jsonBlog) if err != nil { panic(err) } // fmt.Println(agent) r.Redirect("/blog") }) m.Get("/blog/write", func(r render.Render) { r.HTML(200, "blog-form", nil) }) m.RunOnAddr(":8080") }
package main import "fmt" import "encoding/json" type Blog struct { id string things string tag []string } func main() { fmt.Println("\nMari mulai belajar list dan map Golang ...") // list listA := []string{"ikan","sayur","buah", "1", "2", "3"} listB, _ := json.Marshal(listA) fmt.Println("\nlistA adalah " + string(listB)) listA2 := []int{1,2,3} listB2, _ := json.Marshal(listA2) fmt.Println("\nlistA2 adalah " + string(listB2)) // dict mapA := map[string]int {"apple": 5, "lettuce": 7} mapB, _ := json.Marshal(mapA) fmt.Println("\nmapA adalah " + string(mapB)) fmt.Println("\nlist A") for _, value := range listA { fmt.Println(value) } fmt.Println("\nlist A2") for _, value := range listA2 { fmt.Println(value) } fmt.Println("\nmapA") for key , value := range mapA { fmt.Println(key + " " + fmt.Sprint(value)) } // manipulate list fmt.Println("\nAppend listA") x := append(listA, "77") fmt.Println(x) // modify semua listA fmt.Println("\nModify listA") var modListA []string for _, value := range listA { modListA = append(modListA, "mod:" + value) } fmt.Println(modListA) }script diatas menghasilkan output
D:\PROJECTS\GO-APP>go run coba_json_sendiri.go Mari mulai belajar list dan map Golang ... listA adalah ["ikan","sayur","buah","1","2","3"] listA2 adalah [1,2,3] mapA adalah {"apple":5,"lettuce":7} list A ikan sayur buah 1 2 3 list A2 1 2 3 mapA lettuce 7 apple 5 Append listA [ikan sayur buah 1 2 3 77] Modify listA [mod:ikan mod:sayur mod:buah mod:1 mod:2 mod:3]
Yang saya tahu pada awalnya, pada #javascript dan #python a = ['ikan', 'sayur', 'buah', 1, 2, 3] selesai, list sudah langsung terbentuk bahkan dengan #php pun mudah a = array('ikan', 'sayur', 'buah', 1, 2, 3) Buum, jadi .... di GO lumayan runyam, namun JELAS dan RAPI listA := []string{"ikan","sayur","buah", "1", "2", "3"} listB, _ := json.Marshal(listA) fmt.Println(string(listB)) // output ["ikan","sayur","buah","1","2","3"] listA2 := []int{1,2,3} listB2, _ := json.Marshal(listA2) fmt.Println(string(listB2)) // output [1,2,3] listA adalah list dengan type data STRING, angka bisa masuk, tapi dia tidak diperlakukan sebagai INT (dengan petik dua "") sedangankan listA2 adalah list dengan type data INT, anggotanya benar-benar angka (tanpa petik dua ""), ikan sayur buah ERROR pada saat di-compile jika dipaksakan masuk kode lengkapnya #go-nya : package main import "fmt" import "encoding/json" type Blog struct { id string things string tag []string } func main() { fmt.Println("Mari mulai ...") // list listA := []string{"ikan","sayur","buah", "1", "2", "3"} listB, _ := json.Marshal(listA) fmt.Println(string(listB)) listA2 := []int{1,2,3} listB2, _ := json.Marshal(listA2) fmt.Println(string(listB2)) // dict mapA := map[string]int {"apple": 5, "lettuce": 7} mapB, _ := json.Marshal(mapA) fmt.Println(string(mapB)) }
package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi :) ... I love %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }http://webkoe.net:8080