在不求助于字符串、strvconv 等的情况下处理 bytes.Buffer
working a bytes.Buffer without resorting to strings, strvconv, etc
我只想在不求助于 strconv 和字符串的情况下执行此操作,但我不精通仅使用字节:
func rangeSeq(b *bytes.Buffer) ([][]byte, bool) {
q := bytes.Split(b.Bytes(), []byte{SEQ_RANGE})
if len(q) == 2 {
var ret [][]byte
il, lt := string(q[0]), string(q[1])
initial, err := strconv.ParseInt(il, 10, 64)
last, err := strconv.ParseInt(lt, 10, 64)
if err == nil {
if initial < last {
for i := initial; i <= last; i++ {
out := strconv.AppendInt([]byte{}, i, 10)
ret = append(ret, out)
}
}
return ret, true
}
}
return nil, false
}
建议?
没有 []byte
等同于 strconv.Parse* 函数(参见 issue 2632)。使用 strconv 是目前处理此问题的最简单方法。
但是您忽略了第一个错误,这是一个错误。您还可以缩短一些内容,并使用更常见的成语 returning early 而不是增加缩进。我还会 return 一个错误,而不是 bool 以获得更多上下文信息。
func rangeSeq(b *bytes.Buffer) ([][]byte, error) {
q := bytes.Split(b.Bytes(), sep)
if len(q) != 2 {
return nil, fmt.Errorf("invalid value: %s", b)
}
var ret [][]byte
initial, err := strconv.Atoi(string(q[0]))
if err != nil {
return nil, err
}
last, err := strconv.Atoi(string(q[1]))
if err != nil {
return nil, err
}
if initial < last {
for i := initial; i <= last; i++ {
ret = append(ret, strconv.AppendInt(nil, i, 10))
}
}
return ret, nil
}
我只想在不求助于 strconv 和字符串的情况下执行此操作,但我不精通仅使用字节:
func rangeSeq(b *bytes.Buffer) ([][]byte, bool) {
q := bytes.Split(b.Bytes(), []byte{SEQ_RANGE})
if len(q) == 2 {
var ret [][]byte
il, lt := string(q[0]), string(q[1])
initial, err := strconv.ParseInt(il, 10, 64)
last, err := strconv.ParseInt(lt, 10, 64)
if err == nil {
if initial < last {
for i := initial; i <= last; i++ {
out := strconv.AppendInt([]byte{}, i, 10)
ret = append(ret, out)
}
}
return ret, true
}
}
return nil, false
}
建议?
没有 []byte
等同于 strconv.Parse* 函数(参见 issue 2632)。使用 strconv 是目前处理此问题的最简单方法。
但是您忽略了第一个错误,这是一个错误。您还可以缩短一些内容,并使用更常见的成语 returning early 而不是增加缩进。我还会 return 一个错误,而不是 bool 以获得更多上下文信息。
func rangeSeq(b *bytes.Buffer) ([][]byte, error) {
q := bytes.Split(b.Bytes(), sep)
if len(q) != 2 {
return nil, fmt.Errorf("invalid value: %s", b)
}
var ret [][]byte
initial, err := strconv.Atoi(string(q[0]))
if err != nil {
return nil, err
}
last, err := strconv.Atoi(string(q[1]))
if err != nil {
return nil, err
}
if initial < last {
for i := initial; i <= last; i++ {
ret = append(ret, strconv.AppendInt(nil, i, 10))
}
}
return ret, nil
}