Thank you Steven. I am a little bewildered by the new mod configuration. Will it compile If I download the source file from the new github source to src directory without further setting up a mod in the old fashioned way? I am using go1.15.
And today I ran a test logging all the sendings to Redis and readings from Redis. It is fine - nothing went wrong. But AnotherRedisDesktopManager still shows the same string format - which I guess is due to it is 32bit and fail to transfer a long decimal to float32. So nothing is wrong in golang or its open-source package. On Tue, Apr 12, 2022 at 9:56 PM Steven Hartland <ste...@multiplay.co.uk> wrote: > First off, the package you're using for redis isn't maintained; you should > switch to github.com/gomodule/redigo/redis instead, which will allow you > to remove the c == nil check as that doesn't happen. > > In your example you're ignoring error from json.Marshal which could be > hiding a problem, so I would recommend you handle that. > > encoding/json should represent float as a json number so I would never > expect what you're seeing but its not clear to me if that is down to how > you are viewing it. > > On Tue, 12 Apr 2022 at 04:02, Zhaoxun Yan <yan.zhao...@gmail.com> wrote: > >> The scenario is upon receiving an incoming financial quotation, save it >> as a string of json into a Redis service. Sorry but I cannot provide the >> whole code of quotation receiving here, which is very complex with cgo. But >> the code below will help you get a glimpse on what should be going on: >> >> import ( >> "encoding/json" >> //"errors" >> "fmt" >> "time" >> >> "github.com/garyburd/redigo/redis" >> ) >> >> var pool *redis.Pool >> >> type Fvprices struct { >> P float64 `json:"price"` >> F float64 `json:"floor"` >> C float64 `json:"ceiling"` >> S float64 `json:"settle"` >> T int64 `json:"time"` >> } >> >> func init() { >> pool = newPool() >> } >> >> var redisport = "6379" >> var redisip = "127.0.0.1" >> var password = "" >> >> func newPool() *redis.Pool { >> >> fmt.Println("redis @", redisport, redisip, password) >> return &redis.Pool{ >> MaxIdle: 4, >> MaxActive: 50, // max number of connections >> IdleTimeout: 30 * time.Second, >> >> Dial: func() (redis.Conn, error) { >> c, err := redis.DialURL("redis://" + redisip + ":" + >> redisport) >> if err != nil { >> ErrMsg = fmt.Sprintf("redis connection error: %s", err. >> Error()) >> fmt.Println(time.Now().Format("2006-01-02 15:04:05"), >> ErrMsg) >> return nil, err >> } >> if _, autherr := c.Do("AUTH", password); autherr != nil { >> ErrMsg = fmt.Sprintf("redis password error: %s", err. >> Error()) >> fmt.Println(time.Now().Format("2006-01-02 15:04:05"), >> ErrMsg) >> return nil, autherr >> } >> return c, nil >> }, >> } >> } >> >> func Upfutureprice(future_id string, >> future_price, lowerLimitPrice, upperLimitPrice, preSettlementPrice >> float64, >> updatetime time.Time) { >> >> c := pool.Get() >> if c == nil { >> return >> } >> defer c.Close() >> >> content := Fvprices{ >> P: future_price, >> F: lowerLimitPrice, >> C: upperLimitPrice, >> S: preSettlementPrice, >> T: updatetime.UnixNano() / 1e6, >> } >> >> js, _ := json.Marshal(content) >> >> if _, err := c.Do("SET", future_id, js); err != nil { >> fmt.Println("cannot save to redis:", err) >> } >> } >> >> So obviously until the function "Upfutureprice" everything is correct, >> for all four prices it receives are in float64 format. After running this >> program for one day, I just browse the redis using >> AnotherRedisDesktopManager via ssh port forwarding, and something strange >> happens as I clicking on various future_id key strings: >> >> { >> price:807 >> floor:720.6 >> ceiling:881 >> settle:"800.8000000000001" >> time:1649726499000 >> } >> >> { >> price:"3691.0000000000005" >> floor:3237 >> ceiling:4204 >> settle:3721 >> time:1649726910500 >> } >> >> { >> price:"15405.000000000004" >> floor:13625 >> ceiling:17340 >> settle:15485 >> time:1649728303500 >> } >> >> { >> price:"800.4000000000001" >> floor:720.6 >> ceiling:881 >> settle:"800.8000000000001" >> time:1649728048000 >> } >> >> Note quotations above. I wonder how encoding/json can made transformation >> from a float64 inside struct Fvprices to a string instead? It seems >> that only long decimals would trigger such an error while short decimals >> won't: >> >> { >> price:2910 >> floor:2443.5 >> ceiling:3305.5 >> settle:2874.5 >> time:1649728261026 >> } >> >> How could that happen? I am really puzzled. >> >> Regards, >> Zhaoxun >> >> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts+unsubscr...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/golang-nuts/f42b29b3-de17-48c6-9f71-1176f1288396n%40googlegroups.com >> <https://groups.google.com/d/msgid/golang-nuts/f42b29b3-de17-48c6-9f71-1176f1288396n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CADEX6_X7zenqGNWSsiZ8mfHZMnyCVsPmspRs%2BKxkcsc6d3tOKg%40mail.gmail.com.