2015-08-26 51 views
1

我只是想做到這一點,而不訴諸STRCONV &字符串,但我只在字節不精通的工作:工作一bytes.Buffer而不是訴諸字符串,strvconv等

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 
} 

建議?

+0

我們對輸入數字有任何保證嗎?例如。他們總是積極的,或者他們也可能是消極的?數字也可以在零之前,例如數字「10」可以寫爲「00010」? – icza

+0

目前還沒有關於輸入的保證,它的所有解析[]字節從配置文件在這一點上 – blueblank

回答

3

沒有[]byte等同於strconv.Parse *函數(請參閱issue 2632)。使用strconv是目前處理這個問題的最簡單方法。

但是你忽略了第一個錯誤,這是一個錯誤。你也可以縮短一些事情,並使用較早迴歸的常見成語,而不是增加縮進。我也會返回一個錯誤,而不是一個布爾更多的上下文信息。

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 
} 
+0

hmm,仍然我想要從字節到字符串的int跳到字節,如果有更平滑的方式;如果它不是問題,那麼它看起來不那麼流暢,比它應該更麻煩 – blueblank

+0

@blueblank:如果你想將字符解析爲整數(並且它看起來就是你想要做的數字比較),那麼你需要轉換爲字符串,以便將其傳遞給'strconv.ParseInt'。 – JimB