Go 语言编程实例(六)

本节主要分享:JSON、时间日期、Epoch、时间格式化解析、伪随机数

以下代码在存放于github中如下仓库:github

Go JSON实例

JSON格式在网络通讯中使用的比较频繁,简单而优雅。Go 提供了对JSON编码和解码的内置支持,包括内置和自定义数据类型。

package main

import (
    "encoding/json"
    "fmt"

    "os"
)

type Response1 struct{
    Page int
    Fruits []string
}

type Response2 struct{
    Page   int       `json:"page"`
    Fruits []string  `json:"fruits"`
}

func main(){
    bolB,_:=json.Marshal(true)
    fmt.Println(string(bolB))

    intB,_:=json.Marshal(1)
    fmt.Println(string(intB))

    fltB,_:=json.Marshal(2.34)
    fmt.Println(string(fltB))

    //slice,map示例 编码成json 数组

    slcD := []string{"apple","peach","pear"}
    slcB , _ := json.Marshal(slcD)
    fmt.Println(string(slcB))

    mapD := map[string]int {"apple":5,"lettuce":7}
    mapB , _ := json.Marshal(mapD)
    fmt.Println(string(mapB))


    //自动编码自定义数据
    res1D := &Response1{
        Page: 1,
        Fruits:[]string{"apple","peach","pear"}}
    res1B ,_ :=json.Marshal(res1D)
    fmt.Println(string(res1B))

    res2D := &Response2{
        Page: 1,
        Fruits:[]string{"apple","peach","pear"}}
    res2B , _ := json.Marshal(res2D)
    fmt.Println(string(res2B))

    byt := []byte(`{"num":6.13,"strs":["a","b"]}`)

    var dat map[string]interface{}

    if err := json.Unmarshal(byt,&dat);err != nil{
        panic(err)
    }
    fmt.Println(dat)

    num:= dat["num"].(float64)
    fmt.Println(num)

    strs := dat["strs"].([]interface{})
    str1 := strs[0].(string)
    fmt.Println(str1)

    str := `{"page":1,"fruits":["apple","peach"]}`
    res := Response2{}

    json.Unmarshal([]byte(str),&res)
    fmt.Println(res)
    fmt.Println(res.Fruits[0])

    enc:= json.NewEncoder(os.Stdout)
    d := map[string]int{"apple":5,"lettuce":7}
    enc.Encode(d)
}

Go 时间日期编程

Go 编程为时间和持续时间提供了广泛的支持。示例是从获取当前时间开始,创建时间结构体进行解析,时间对比,两个时间的间隔问题,时间的加减问题。

package main

import (
    "fmt"
    "time"
)

func main(){
    p := fmt.Println

    //得到当前时间
    nowtime := time.Now()
    p(nowtime)

    //创建一个时间结构体进行解析
    then := time.Date(
        2017,8,18,19,34,52,621544,time.UTC)

    p(then)

    //这里可以使用其他的函数不一一例举了
    p(then.Year())
    p(then.Month())
    p(then.Second())
    p(then.Location())
    p(then.Weekday())

    //同时可以进行时间的比对
    p(then.Before(nowtime))
    p(then.After(nowtime))
    p(then.Equal(nowtime))

    //两个时间的间隔
    diff := nowtime.Sub(then)

    p(diff)

    p(diff.Hours())
    p(diff.Minutes())
    p(diff.Seconds())
    p(diff.Nanoseconds())

    //时间加减
    p(then.Add(diff))
    p(then.Add(-diff))
}

Go 时代(Epoch)实例

程序中的一个常见要求是获取自 Unix 纪元依赖的秒数,毫秒数或纳秒数。示例是使用 UnixUnixNano 的 time.Now ,分别以秒或者纳秒为单位获得自 Unix 纪元起经过的时间。

同时也有方法将整数秒或者纳秒转换为相应的时间。

package main

import (
    "time"
    "fmt"
)

func main(){

    //使用 time.Now() 与 Unix 或者 UnixNano 并用获得时间
    now  := time.Now()
    secs := now.Unix()
    nanos:= now.UnixNano()
    fmt.Println(now)


    millis := nanos/1000000
    fmt.Println(secs)
    fmt.Println(millis)
    fmt.Println(nanos)

    //通过秒或者纳秒反向求解

    fmt.Println(time.Unix(secs,0))
    fmt.Println(time.Unix(0,nanos))
}

Go时间格式化/解析实例

Go 支持通过基于模式的布局进行时间格式化和解析。这里是根据 RFC3339 格式化时间的一个基本示例,还有错误示例。

package main

import (
    "fmt"
    "time"
)

func main(){
    p := fmt.Println

    t := time.Now()
    p(t.Format(time.RFC3339))


    t1 , _ := time.Parse(
        time.RFC3339,
        "2017-11-01T22:35:52+00:00")
    p(t1)

    //格式化和解析

    p(t.Format("3:04PM"))
    p(t.Format("Mon Jan _2 15:04:05 20017"))
    p(t.Format("2006-01-02T15:04:05.99999-08:00"))

    form := "3 04 PM"
    t2,_ := time.Parse(form,"8 41 PM")
    p(t2)

    fmt.Printf("%d-%02d-%02dT%02d:%02d:%02d-00:00\n",
            t.Year(),t.Month(),t.Day(),
            t.Hour(),t.Minute(),t.Second())

    //错误处理
    ansic := "Mon jan _2 15:04:05 2006"
    _,e:=time.Parse(ansic,"8:41PM")
    p(e)
}

Go 随机数示例

Go 的 math/rand 包提供伪随机数生成。例如,rand.Intn 返回一个随机 int n,0 <= n < 100。 rand.Float64 返回一个 float64 f, 0.0 <= f < 1.0 。这可以用于生产其他范围内的随机浮点,例如 5.0 <= f < 10.0

这是一个伪随机数,每次进入调用函数产的第一个随机都是一样的。

package main

import (
    "fmt"
    "math/rand"
)

func main(){
    p := fmt.Println

    //产生 0 - 100 的伪随机数
    p(rand.Intn(100))
    p(rand.Intn(100))

    //产生浮点随机数
    p(rand.Float64())
    p(rand.ExpFloat64()*10)
    p(rand.ExpFloat64()*100)

    
}

如需进一步讨论可以加群:295023494

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 我发现咨询是一件和生活很相似的事情,当来访者不想透露太多时你不要去挖掘,当你挖掘的越多你和来访者可能都会受到伤害,...
    coolsharer阅读 229评论 0 0
  • 想了一段时间该如何着手去写ARKit的东西(并不是没学一直瞎想呢😄),还是觉着吧,先把ARKit 捋一遍。 ARK...
    A訫飛Flyme阅读 475评论 0 0
  • 侥幸一下又何妨呢? 小记:有人说很多事情是不可控的? 我也赞同呢。 就拿练字来说吧,今天第一篇临摹练习“周”这个字...
    魍魍亼阅读 190评论 0 0