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.

Reply via email to