By: minux.ma # gmail.com
FROM: https://groups.google.com/group/golang-china/msg/f71b2bd13b239313
今天在邮件列表里面讨论GC相关的问题的时候,聊到了Go Release发行相关的流程,@minux 详细总结了一下,下面原文。
PS: @minux 给Go核心代码里面提交了不少代码。
Dmitriy Vyukov前一阵(5月)在搞这个,已经提交了以下改动,
http://codereview.appspot.com/6223050 faster GC mark phase
http://codereview.appspot.com/6215065 faster GC sweep phase
后来又有几个小的性能微调,其他的暂时不知道;
PS: 可能还有人不清楚,我详细说下Go release相关的事情:
1, Go 1之后取消weekly发布,理由是这样会fragment user base
至少在短期内不会恢复;想要尝鲜的直接建议使用default分支;它是足够稳定的;
2, 当积累了足够的重要的bugfixes之后,会考虑发布一个新的Go 1.0.x版本;
其特点是:cherry pick一部分default分支的commit到release分支;要求是
不引入任何API改动(新加入API都不会考虑,如果一个bugfix必须引入新API,
那么要么这个改动不被选择要么会把导出符号改成非导出符号);保证用户
可以安全升级。
这个版本的发布流程大概包括如下三歩:
(1) 在golang-dev发布一个表格指示哪些commit计划被加入新的发布;此阶段
接受意见,但是绝大多数情况下只会接受反对加入某个commit的意见;想要
加入一个新commit是要花很大精力的。
这个表格以CL的形式发布方便大家评论。
示例:http://codereview.appspot.com/6279048/ (cherry pick的过程是自动的,
这个CL里面包含所需要的所有脚本)
(2) 在golang-dev发布几个preview,但是都不打包,需要自己去clone然后测试,
面向开发者
比如这个:https://groups.google.com/d/topic/golang-dev/9UtB9iZBo4o/discussion
(3) 发布
在所有支持的系统上编译测试然后制作安装包,测试;上传到
http://code.google.com/p/go/downloads/list;然后在go-nuts发布更新说明;
关于Go 1.0.3的发布日期到现在也没有确定;而且还有标记优先级为Soon的问题
没解决,所以可能还得等等;
3,经过足够考验后的default分支在合适的时候用来发布Go 1.1
所有前段时间的改变,包括新添加的API会在这个时候发布出来。
也就是这次会是个merge。据说是今年年底发布这个。
-EOF-
今天没事想把招商证券保存的股票数据提取出来, 后来发现招商证券的软件是采用是通达信做的, 这样直接通过查找通达信的数据格式就搞定了.
主要参考: http://alantop.5166.info/gpdatasoft/gpformat/gpformat.htm#_Toc224993378
通达信日线
每条数据文件占32个字节。每四个字节代表一个变量。如下所示:
1
2
3
4
5
6
7
8
9
10
11
| struct stockDay
{
uint32_t date; //日期
uint32_t open; //开盘价,单位:分
uint32_t high; //最高价,单位:分
uint32_t low; //最低价,单位:分
uint32_t close; //收盘价,单位:分
float amount; //交易金额,单位:元
uint32_t vol; //成交量,单位:股
int32_t reserv; //保留,有时用来保存上一交易日收盘价
}; |
我分别使用C和Go写了个简单的提取程序.
C代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| #include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
struct stockDay
{
uint32_t date; //日期
uint32_t open; //开盘价,单位:分
uint32_t high; //最高价,单位:分
uint32_t low; //最低价,单位:分
uint32_t close; //收盘价,单位:分
float amount; //交易金额,单位:元
uint32_t vol; //成交量,单位:股
int32_t reserv; //保留,有时用来保存上一交易日收盘价
};
void printDay(struct stockDay *day)
{
printf("日期: %d, ", day->date);
printf("开盘价: %.2f, 最高价: %.2f, 最低价: %.2f, 收盘价: %.2f, ", day->open/100.0, day->high/100.0, day->low/100.0, day->close/100.0);
printf("交易金额: %f, 交易量: %d\n", day->amount, day->vol);
}
int main()
{
FILE *p;
int i = 0;
char *file = "./sh600529.day";
struct stockDay *day = malloc(sizeof(struct stockDay));
p = fopen(file, "r");
if (p) {
fseek(p, 0, SEEK_END);
uint64_t iFileLen = ftell(p)/(sizeof(struct stockDay));
rewind(p);
for (i = 0; i < iFileLen; i++) {
memset(day, 0, sizeof(struct stockDay));
fread(day, sizeof(struct stockDay), 1, p);
printDay(day);
}
} else {
printf("Read File: %s Error!\n", file);
}
free(day);
fclose(p);
return 0;
} |
Go的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| package main
import (
"bytes"
"encoding/binary"
"fmt"
"io/ioutil"
"unsafe"
)
type StockDay struct {
date uint32 //日期
open uint32 //开盘价,单位:分
high uint32 //最高价,单位:分
low uint32 //最低价,单位:分
cls uint32 //收盘价,单位:分
amount float32 //交易金额,单位:元
vol uint32 //成交量,单位:股
reserv int32 //保留,有时用来保存上一交易日收盘价
}
func main() {
contents, _ := ioutil.ReadFile("./sh887001.day")
//println(string(contents));
var day StockDay
size := int(unsafe.Sizeof(day))
fmt.Printf("sizeof: %d, days: %d\n", size, len(contents)/size)
for i := 0; i < len(contents); i += 32 {
buf := bytes.NewBuffer(contents[i : i+4])
err := binary.Read(buf, binary.LittleEndian, &day.date)
if err != nil {
fmt.Println("binary.Read failed: ", err)
}
buf = bytes.NewBuffer(contents[i+4 : i+8])
err = binary.Read(buf, binary.LittleEndian, &day.open)
buf = bytes.NewBuffer(contents[i+8 : i+12])
err = binary.Read(buf, binary.LittleEndian, &day.high)
buf = bytes.NewBuffer(contents[i+12 : i+16])
err = binary.Read(buf, binary.LittleEndian, &day.low)
buf = bytes.NewBuffer(contents[i+16 : i+20])
err = binary.Read(buf, binary.LittleEndian, &day.cls)
buf = bytes.NewBuffer(contents[i+20 : i+24])
err = binary.Read(buf, binary.LittleEndian, &day.amount)
buf = bytes.NewBuffer(contents[i+24 : i+28])
err = binary.Read(buf, binary.LittleEndian, &day.vol)
fmt.Printf("%v\n", day)
}
} |
代码也贴在Github上: https://gist.github.com/1578661
ps: 目前5分钟线的月份和日期对不上, 不知道哪位高手搞过?
–EOF–
今天没事想用go从文件中提取些二进制数据,并把数据转换为相关的数据类型, 就找到一个把数组转换为float类型的数据。主要用到了encoding/binary包里面的read函数, 它可以根据你数据的大小端得到相关的数据类型。
主要代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| package main
import (
"bytes"
"encoding/binary"
"fmt"
)
func main() {
var pi float64
b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}
buf := bytes.NewBuffer(b)
err := binary.Read(buf, binary.LittleEndian, &pi)
if err != nil {
fmt.Println("binary.Read failed:", err)
}
fmt.Println(pi)
} |
下面是go里面uint32在大小端的分别实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| bvcom@bvcomtv:~$ godoc -src encoding/binary Uint32
// A ByteOrder specifies how to convert byte sequences into
// 16-, 32-, or 64-bit unsigned integers.
type ByteOrder interface {
Uint32([]byte) uint32
// contains filtered or unexported methods
}
func (littleEndian) Uint32(b []byte) uint32 {
return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
}
func (bigEndian) Uint32(b []byte) uint32 {
return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
} |
参考:
Convert 8 byte array to int64? Options: http://groups.google.com/group/golang-nuts/browse_thread/thread/7f541090fd7d1bd4
Reading byte array as another datatype Options: http://groups.google.com/group/golang-nuts/browse_thread/thread/fc00115bf5b35757
http://golang.org/src/pkg/encoding/binary/binary.go?s=3435:3501#L117
–EOF–
在golang-nuts邮件列表里面, 有人问了有关Go 1的情况, golang的主要开发者Brad Fitzpatrick说: Go 1 相关的库和包, 都已经完成, 节后只修复相关的Bug, 修复完后就会发布Go 1.
如果你想使用可以使用最新Weekly版本2011-12-22, 这个基本上就是Go1 版本.
原文如下:
All the major Go 1 language & library changes are now in. Bug fixing &
polish begins after the holidays, then some release candidates will start
going out. The latest weekly, 2011-12-22 is basically what Go 1 will be,
if you want to start playing.
参考: http://groups.google.com/group/golang-n … 3abf4b868b
Categories: golang Tags: andrew, appengine, cuddle, gae, go, golang, Google, package, rob, talk, template, topic
Recent Comments