手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:Go

go开发二三事

在用go写程序的时候,遇到了一点点的事情。记录了下来

 
1、字符串转[]byte,网上有代码:MakeSlice(这是一个函数),也可以直接[]byte(string)
2、byte转字符串,这个就比较简单了 string([]byte)
3、byte转int。这时候就只能用 binary.Read(bytes.NewBuffer(buf[0:4]),binary.BigEndian, &outdata )
4、conn.Read的时候。如果我知道了剩下数据的长度时,我想 var x [len]byte,但这样会报错,out of array size,所以,经过指点是可以 x:=make([]byte,len),当然也可以x:=make([]byte,0,len),这里面其实就是Cap和len的关系了
 
---分隔线
对于上述第3点,群里的Larry说,其实可以通过binary.BigEndian.Uint32(buf[0:4])来转换。试了一下,果然可以,而且这样做之后,连bytes包也不用加载了。
再看了下文档,原来 binary.BigEndian implents ByteOrder,而ByteOrder这个struct有几个方法:
XML/HTML代码
  1. type ByteOrder interface {  
  2.         Uint16([]byte) uint16  
  3.         Uint32([]byte) uint32  
  4.         Uint64([]byte) uint64  
  5.         PutUint16([]byte, uint16)  
  6.         PutUint32([]byte, uint32)  
  7.         PutUint64([]byte, uint64)  
  8.         String() string  
  9. }  

实在太实用了

用ST2写go程序时遇到的坑

昨天下午遇到一件非常诡异的事情,即,我在程序里明明有一个公开的方法,比如:

func Fuck{

    fmt.Println("fuck")

}

但是在调用的时候一直不显示,而是提示我方法不存在。我为此折腾了1个多小时,后来到群里一问,一哥们立刻说:你试试用go run -a xxx.go

于是试用了一下,正常了。

这哥们解释说:st2等IDE为了能够做代码提示,往往都会预编译成.a的文件的,所以需要用-a参数。

做个记录。如果你遇到这个问题,也可以尝试一下

Tags: st2

type ttt struct{} var t ttt; 与 t := New(ttt) 有什么区别?

 在实际中遇到了标题的问题,即:

type ttt struct{}
var t ttt;
t := New(ttt)
有什么区别?
 
包括手册上都说好象没啥区别( 我记得好象是《go 云动力》)
但是我在测试jsonrpc的时候,用 var t ttt的方式 时:
XML/HTML代码
  1. 2013/05/31 12:46:35 rpc.Register: type Arith has no exported methods of suitable type (hint: pass a pointer to value of that type)  
换成t:=New(ttt),就OK了
------
新手,暂时不知其所以然,先记录和备份一下
 
 
 
 

golang将byte的int转换

在使用golang做数据传输的时候,会经常遇到byte与int的互转,但golang并没有现成的方法,因此只能通过binary包来解决

所以,需要 :import "encoding/binary",又因为是byte的转换,所以还涉及到了bytes:import "bytes"

代码如下:

XML/HTML代码
  1. package main  
  2.   
  3. import (  
  4.     "bytes"  
  5.     "encoding/binary"  
  6.     "fmt"  
  7.     "strings"  
  8. )  
  9.   
  10. func main() {  
  11.     b := []byte{0x00, 0x00, 0x03, 0xe8}  
  12.     b_buf :bytes.NewBuffer(b)  
  13.     var x int32  
  14.     binary.Read(b_buf, binary.BigEndian, &x)  
  15.     fmt.Println(x)  
  16.   
  17.     fmt.Println(strings.Repeat("-", 100))  
  18.   
  19.     x = 1000  
  20.     b_buf = bytes.NewBuffer([]byte{})  
  21.     binary.Write(b_buf, binary.BigEndian, x)  
  22.     fmt.Println(b_buf.Bytes())  
  23. }  
基本上就这么解决了。其实下面不赋值x也无所谓。因为本来就是1000

 

Tags: 类型转换

golang的json处理

 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

Records:3812345678