Submitted by gouki on 2013, May 29, 1:12 PM
在使用golang做数据传输的时候,会经常遇到byte与int的互转,但golang并没有现成的方法,因此只能通过binary包来解决
所以,需要 :import "encoding/binary",又因为是byte的转换,所以还涉及到了bytes:import "bytes"
代码如下:
XML/HTML代码
- package main
-
- import (
- "bytes"
- "encoding/binary"
- "fmt"
- "strings"
- )
-
- func main() {
- b := []byte{0x00, 0x00, 0x03, 0xe8}
- b_buf := bytes.NewBuffer(b)
- var x int32
- binary.Read(b_buf, binary.BigEndian, &x)
- fmt.Println(x)
-
- fmt.Println(strings.Repeat("-", 100))
-
- x = 1000
- b_buf = bytes.NewBuffer([]byte{})
- binary.Write(b_buf, binary.BigEndian, x)
- fmt.Println(b_buf.Bytes())
- }
基本上就这么解决了。其实下面不赋值x也无所谓。因为本来就是1000
Tags: 类型转换
Go | 评论:1
| 阅读:46695
Submitted by gouki on 2013, May 29, 12:05 PM
golang的Json处理还算是比较方便的吧?
比如:json.Marshal就完成了处理。
OK,开始说事儿:
1、
var s = make(map[string]interface{})
s["userid"] = "123"
s["time"] = "12345"
result , _ = json.Marshal(s);
println(string(result))
这时候你会发现,打印出来的json数据。。。time居然在前面。。。map没有顺序,果然是这样的。
那怎么把userid放在最前面呢?
2、type JsonData struct{
UserId string `json:"userid"`
Time string `json:"time"`
}
j := JsonData{UserId:"123",Time:"12345"}
result,_ = json.Marshal(j);
println(result);
这时候出来的才是按顺序的json数据
这两种情况根据需要写吧。其实我自己是比较偏向于第一种,json要顺序干嘛。不过有些程序写的比较硬编码,不是按JSON解析的话,就只能用第二种,定义标准的输出了。。
再加上之前我也记录过,json.Marshal,只针对struct中的首字符大写的KEY进行encode,小写直接就忽略,所以还必须得写上tag。好痛苦的事情啊
Tags: json, golang
Go | 评论:0
| 阅读:24542
Submitted by akuma on 2013, May 28, 10:21 PM
今天在备份移动硬盘的时候,突然提示我文件名过长,无法删除。
按F2也无法重命名,一直提示:文件名过长
这个文件名是我的Sandbox中自动生成的IE的缓存文件。
网上找了很多资料都说这个无法避免
1、命令行move无效,命令行Ren无效,命令行rd无效,命令行Delete无效
2、最后看资料,说这有两种情况,1是本身文件名确实很长,2是全路径很长,即所有路径加起来,导致超过N个字节(3xxxx字节),这明显不可能嘛 。于是我尝试将这些Content.IE的目录一级级的往外拷贝,直到根目录。然后重命名成任意目录,再执行删除,成功
备份一下这次的操作过程。下次可以做参考
Misc | 评论:0
| 阅读:16856
Submitted by gouki on 2013, May 28, 4:27 PM
利用cat将内容写入文件其实很方便:
echo 10 | cat > /var/www/test.txt
两个函数一个管道,就这样完成了。
在这里我不多介绍cat的操作用法,毕竟很多时候用cat只是为了看一个文件 ,真要学了,网上有大把的资料
事实上,想这样调整的时候是因为我在做一个处理,即PHP的函数:msg_send和shm_*系列
1、用shm_*写程序。在命令行接收,动不动就挂掉。。。我人也崩溃了,太不稳定了
2、用msg_send和msg_receive发,用msg_queue_stat统计的时候,发现即使我的内容很短,也只能qmax为40,这时候我就在想是不是有其他原因,有人说可以调整/proc/sys/fs/mqueue/msg_max,因为来自proc,所以我想到了用cat写入。于是就有了本文
---EOF---
最后,由于msg_send其实他能够接受的最大字节数就是16384,所以,如果你的内容过大。比如我一条信息就是500字节,明显qmax最多只有32.而且最大字节还不能调整。。。或者说调整无效。。。
于是我现在msg_send发送的时候,其实message的内容是文件名。receive后,读取文件内容处理完毕后删除文件 。如果处理失败,扔到failed目录里
最后再有一个程序glob("/xxxx/*")进行按批处理。
蛋疼就是这样产生的
Linux | 评论:0
| 阅读:21695
Submitted by gouki on 2013, May 27, 10:18 PM
在golang里面获取时间戳并不难。只要加载time包。然后time.Now().Unix(),就可以了,但接下来转成string就麻烦了
本来,加载strconv的话,用strconv.Itoa也可以解决,但unixtime的时间戳是int64, itoa只能转32位的。这时候就只有一个恶心的办法了。
fmt.Sprintf("%d",int64),这个是肯定可以转,。。。。我现在就是用这种办法的
做个笔记
--EOF--
后记,在群里问了一下,结果asta谢就说了。明明有strconv.FormatInt,用godoc看了一下,居然没看到。可能我的版本旧了。
strconv.Format(int64 , 10) ,后面的参数是2~36,简单就是php的base_convert的go版本。看来,go做tinyurl也是用这个函数了。哈哈
感谢群友们。
---next
自此,go语言的int转换成string有3种方法
1、int32位,strconv.Itoa
2、大于32位,strconv.FormatInt()
3、万恶的fmt.Sprintf...好吧,这个我在php里是经常用来做格式化
Go | 评论:0
| 阅读:35632