- 01 原生 Golang 自帶的 http package 練習
- 02 顯示表單
- 03 如何避面 CROS
- 04 畫面和物件參數做連結 {{.Title}} {{.Content}}}
- 05 使用第三方 Framework(Gin)
- 06 使用 Gin 開發登入畫面
- 07 連接 MySQL 練習
- 08 連接 MySQL 並使用 gorm
- 09 env 練習
- 10 i18n 練習
- 11 使用者管理 Web api 開發練習,並實作乾淨的架構
- 18_WebSocket
- 21_WebSocket+Redis一對一聊天室
- 23_UniTest
- 100_ginJWT 範例
- 101 Random 隨機數應用範例
- 102_css-roulette-wheel前端參考範例
- 103_bet_plate前端參考範例
- 900_RouletteGo 輪盤 ###輪盤作品請直接參考這個!!!
傳統需要去設定 GOPATH
GOPATH="/Users/Apple/Documents/Go/web-sample-model"
首先要先設定 GO111MODULE 環境變數,總共可以三種不同的值:
auto
默認值,go命令會根據當前目錄来决定是否啟用modules功能。需要滿足兩種情形:
- 該專案目錄不在GOPATH/src/下
- 當前或上一層目錄存在go.mod檔案
on
go 命令會使用 modules,而不會GOPATH目錄下查找。
off
go 命令將不會支持 module 功能,尋找套件如以前 GOPATH 的做法去尋找。
反正設定為 on
就對了,go mod
就像是 java 的 gradle maven、dotnet 的 Nuget 一樣,原生搭載套件管理器!!
go env -w GO111MODULE=on
MacOS 或者 Linux 下開啟 GO111MODULE 的命令為:
export GO111MODULE=on 或者 export GO111MODULE=auto
go mod init web-sample-go
執行之後可以看到會出現一個 go.mod 檔案
假設現在我要引入GitHub上的gin-gonic/gin的套件,如下定義:
module modtest
go 1.13
require github.com/gin-gonic/gin v1.5.0
再執行以下指令:
go mod download
會將需要的套件安裝在 GOPATH/pkg/mod 資料夾裡面。而且會發現出現一個 go.sum 的檔案,這個檔案基本上用來記錄套件版本的關係,確保是正確的,是不太需要理會的。
包(Package)的名稱 為包所在的資料夾名稱
抬起頭來FLUSHALL可能太過猛烈了。FLUSHDB是僅刷新數據庫的一個。 FLUSHALL將清除整個服務器。就像服務器上的每個數據庫一樣。 由於問題是關於刷新數據庫的,所以我認為這是一個重要的區別,值得單獨回答。
清除整個 Redius Server
redius-cli FLUSHALL
清除 Redius 該資料庫
redius-cli FLUSHDB
查詢 全部的 key
323-Maxhuang:~ Apple$ redis-cli
127.0.0.1:6379> keys *
1) "61243c22-4351-42eb-aeb4-622bc6b28ac0"
2) "a1969a7a-e1d2-456c-ade8-4e16dd7bfae1"
127.0.0.1:6379>
首先應該明白報這個錯誤說明了你用的jedis方法與redis服務器中存儲數據的類型存在衝突。
例如:數據庫中有一個key是usrInfo的數據存儲的是Hash類型的,但是你使用jedis執行數據
操作的時候卻使用了非Hash的操作方法,比如Sorted Sets裡的方法。此時就會報
ERR Operation against a key holding the wrong kind of value這個錯誤!
問題解決:
先執行一條如下命令,usrInfo為其中的一個key值。
redis 127.0.0.1:6379>type usrInfo
此時會顯示出該key存儲在現在redis服務器中的類型,例如:
redis 127.0.0.1:6379>hash 則表示key為usrInfo的數據是以hash類型存儲在redis服務器裡的,此時操作這個數據就必須使用hset、hget等操作方法。
例如 1 對 1 聊天室的 wait 是用 list
127.0.0.1:6379> keys *
1) "wait"
127.0.0.1:6379> get wait
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> type wait
list
127.0.0.1:6379> LLEN wait
(integer) 1
127.0.0.1:6379> LINDEX wait 0
"8f67935d-ba01-42a7-80b4-5e9a286dab4b"
127.0.0.1:6379>
[Redis]-常用語法速查表 https://www.dotblogs.com.tw/colinlin/2017/06/26/180604
一次取得該 list 所有資料
LRANGE room1 0 -1
刪除 list 裡面的某一筆資料 https://redis.io/commands/lrem
LREM room1 0 "de72bfa2-e8fd-4174-9a8f-15d044925591"
https://wcc723.github.io/css/2017/07/21/css-flex/
https://www.oxxostudio.tw/articles/201601/css-less-01.html
https://ithelp.ithome.com.tw/articles/10205062 https://www.flysnow.org/2018/11/05/golang-concat-strings-performance-analysis.html
https://www.runoob.com/redis/redis-data-types.html
https://www.mdeditor.tw/pl/p4kJ/zh-tw
https://studygolang.com/articles/12285
這邊自己觀念不好,被雷到 前端送來這樣的資料
{
"event":"bets",
"name":"Guest448",
"content":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0]
}
Golang 後端是這樣
type Message struct {
Event string `json:"event"`
Name string `json:"name"`
Content string `json:"content"`
}
func (d *RouletteHandler) ReceiveMessage(s *melody.Session, msg []byte) {
fmt.Println("HandleMessage == " + string(msg)) // 印出收到的訊息
// TODO: 把收到訊息轉換為物件後,方便取值
var message Message
json.Unmarshal(msg, &message)
fmt.Println("is bets message == " + fmt.Sprintf("%#v", message)) //直接把物件轉型成 string 並且列印
印出這樣的 Log
HandleMessage == {"event":"bets","name":"Guest448","content":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0]}
is bets message == http.Message{Event:"bets", Name:"Guest448", Content:""}
可以看到 message 物件中的Content
居然空掉了!
一開始我以為是 json.Unmarshal 的 bug, 想說這也太扯了, 轉一轉資料居然會漏掉。但是去查詢大家的討論只有說會轉成型態的預設值
並沒有空掉的問題!
看到型態我才想到一個可以線上轉 golang struct 的網站,把 json 資料丟上去才發現
https://mholt.github.io/json-to-go/
type AutoGenerated struct {
Event string `json:"event"`
Name string `json:"name"`
Content []int `json:"content"`
}
看完發現原來是自己的型態寫錯
- 把前端 javaScript 的 Content 的值型態改為 string
- 把 golang 的 struct 型態改為 []int
我就把前端的 javascript 資料 array 改成 string
bets.toString()
轉換為 string 型態
ws.send(JSON.stringify({
"event": "bets",
"name": PERSON_NAME,
"content": bets.toString(),
}));