go語言 strconv.ParseInt 的實現分析


字符串與數值之間進行轉換是一個高頻操作,在go語言中,SDK提供 strconv.ParseInt 將字符串轉換為數值,strconv.FormatInt 可以將數值轉換為字符串。

1.首先看下 strconv.ParseInt 函數如何使用:

func ParseInt(s string, base int, bitSize int) (i int64, err error){}

參數:

  • s:數字的字符串形式
  • base:數字字符串的進制,比如:2進制、10進制。
  • bitSize:預期數值的bit大小,用於數值上限限制,最終返回的還是int64類型

2.下面看下函數的具體實現:

strconv.ParseIntstrconv.ParseUint 的一個包裝層,區別在數值結果的基礎上處理符號,因此具體的實現在strconv.ParseUint里面。

func ParseUint(s string, base int, bitSize int) (uint64, error) {
        ...
	case base == 0:
		// Look for octal, hex prefix.
		base = 10    // 當base = 0,默認 base 按賦值10進制
		if s[0] == '0' {
			switch {
			case len(s) >= 3 && lower(s[1]) == 'b':    // 根據字符串的前綴,來判斷二進制。下面同理
				base = 2
				s = s[2:]
			case len(s) >= 3 && lower(s[1]) == 'o':
				base = 8
				s = s[2:]
			case len(s) >= 3 && lower(s[1]) == 'x':
				base = 16
				s = s[2:]
			default:
				base = 8    // 當 0 開頭,默認8進制
				s = s[1:]
			}
		}
	default:
		return 0, baseError(fnParseUint, s0, base)
	}
}

根據進制 base 進制數計算數值,支持2~ 36進制[0-9A-Z]

func ParseUint(s string, base int, bitSize int) (uint64, error) {
      ...
      // 逐個字符判斷,然后累加求和
      for _, c := range []byte(s) {
		var d byte
		switch {
		case c == '_' && base0:
			underscores = true
			continue
		case '0' <= c && c <= '9':
			d = c - '0'
                 // 支持2 ~ 36進制
		case 'a' <= lower(c) && lower(c) <= 'z':
			d = lower(c) - 'a' + 10
		default:
			return 0, syntaxError(fnParseUint, s0)
		}

		if d >= byte(base) {
			return 0, syntaxError(fnParseUint, s0)
		}

		if n >= cutoff {
			// n*base overflows
			return maxVal, rangeError(fnParseUint, s0)
		}
		n *= uint64(base)

		n1 := n + uint64(d)
		if n1 < n || n1 > maxVal {
			// n+v overflows
			return maxVal, rangeError(fnParseUint, s0)
		}
		n = n1
	}
}

3.使用strconv.FormatInt將數值轉換為字符串

func FormatInt(i int64, base int) string {}

參數:

  • i:10進制數值
  • base:進制數

示例:

 // 將10進制數 15 轉換為 16 進制的字符串形式
func Test_FormatUint(t *testing.T) {
	val := strconv.FormatUint(15, 16)
	fmt.Println(val) // output:f
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM