1. 程式人生 > 其它 >4-常用標準庫之-strconv

4-常用標準庫之-strconv

一 介紹

Go不會對資料進行隱式的型別轉換,只能手動去執行轉換操作

轉換資料型別的方式很簡單。

valueOfTypeB = typeB(valueOfTypeA)

例如:

// 浮點數
a := 5.0

// 轉換為int型別
b := int(a)

Go允許在底層結構相同的兩個型別之間互轉。例如:

// MyInt型別的底層是int型別
type MyInt int

// a的型別為MyInt,底層是int
var a MyInt = 5

// 將a(MyInt)轉換為int,b現在是int型別
b := int(5)

// 將b(int)轉換為MyInt,c現在是MyInt型別
c := IT(b)

但注意:

  1. 不是所有資料型別都能轉換的,例如字母格式的string型別"lqz"轉換為int肯定會失敗
  2. 低精度轉換為高精度時是安全的,高精度的值轉換為低精度時會丟失精度。例如int32轉換為int16,float32轉換為int
  3. 這種簡單的轉換方式不能對int(float)和string進行互轉,要跨大型別轉換,可以使用strconv包提供的函式

二 strconv包使用詳解

strconv包實現了基本資料型別與其字串表示的轉換,主要有以下常用函式: Atoi()Itoa()、parse系列、format系列、append系列。

更多函式請檢視官方文件中文文件

2.1 string與int型別轉換

這一組函式是我們平時程式設計中用的最多的。

2.1.1 Atoi()

Atoi()函式用於將字串型別的整數轉換為int型別,函式簽名如下。

func Atoi(s string) (i int, err error)

如果傳入的字串引數無法轉換為int型別,就會返回錯誤。

//var age ="19e"
	var age ="19"
	age1,err:=strconv.Atoi(age)
	if err != nil {
		fmt.Println("轉換出錯")
		return
	}else {
		fmt.Printf("型別是:%T,值是:%d",age1,age1)
	}

2.1.2 Itoa()

Itoa()函式用於將int型別資料轉換為對應的字串表示,具體的函式簽名如下。

func Itoa(i int) string

示例程式碼如下:

i := 999
s2 := strconv.Itoa(i)
fmt.Printf("型別是:%T 值是:%#v\n", s2, s2)

2.1.3 a解釋

這是C語言遺留下的典故,C語言中沒有string型別而是用字元陣列(array)表示字串,所以a指的是array即字串

2.2 Parse系列函式

Parse類函式用於轉換字串為給定型別的值:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。

2.2.1 ParseBool()

func ParseBool(str string) (value bool, err error)

返回字串表示的bool值。它接受1、0、t、f、T、F、true、false、True、False、TRUE、FALSE;否則返回錯誤。

2.2.2 ParseInt()

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

返回字串表示的整數值,接受正負號。

base指定進位制(2到36),如果base為0,則會從字串前置判斷,”0x”是16進位制,”0”是8進位制,否則是10進位制;

bitSize指定結果必須能無溢位賦值的整數型別,0、8、16、32、64 分別代表 int、int8、int16、int32、int64;

返回的err是*NumErr型別的,如果語法有誤,err.Error = ErrSyntax;如果結果超出類型範圍err.Error = ErrRange。

2.2.3 ParseUnit()

func ParseUint(s string, base int, bitSize int) (n uint64, err error)

ParseUint類似ParseInt但不接受正負號,用於無符號整型。

2.2.4 ParseFloat()

func ParseFloat(s string, bitSize int) (f float64, err error)

解析一個表示浮點數的字串並返回其值。

如果s合乎語法規則,函式會返回最為接近s表示值的一個浮點數

bitSize指定了期望的接收型別,32是float32(返回值可以不改變精確值的賦值給float32),64是float64;

返回值err是*NumErr型別的,語法有誤的,err.Error=ErrSyntax;結果超出表示範圍的,返回值f為±Inf,err.Error= ErrRange。

2.2.5程式碼示例

	//1  字串轉布林(1、0、t、f、T、F、true、false、True、False、TRUE、FALSE)
	//res,_:=strconv.ParseBool("false")
	//res,_:=strconv.ParseBool("f")
	//fmt.Printf("型別為:%T,值為:%t",res,res)

	//2 字串轉int
	// base:2到36,指進位制
	// bitSize:0、8、16、32、64 分別代表 int、int8、int16、int32、int64
	//res,_:=strconv.ParseInt("999",10,64)
	//res,_:=strconv.ParseInt("999",10,32)
	//fmt.Printf("型別為:%T,值為:%d",res,res)

	//3 ParseUnit()
	// bitSize指定為幾,都返回uint64,再轉成相應型別不會丟失
	//res,_:=strconv.ParseUint("99",10,64)
	//fmt.Printf("型別為:%T,值為:%d",res,res)

	// 4 ParseFloat()
	res,_:=strconv.ParseFloat("8.99",64)
	fmt.Printf("型別為:%T,值為:%f",res,res)

這些函式都有兩個返回值,第一個返回值是轉換後的值,第二個返回值為轉化失敗的錯誤

2.3 Format系列函式

Format系列函式實現了將給定型別資料格式化為string型別資料的功能。

2.3.1 FormatBool()

func FormatBool(b bool) string

根據b的值返回true或false

2.3.2 FormatInt()

func FormatInt(i int64, base int) string

返回i的base進位制的字串表示。base 必須在2到36之間,結果中會使用小寫字母’a’到’z’表示大於10的數字。

2.3.3 FormatUint()

func FormatUint(i uint64, base int) string

是FormatInt的無符號整數版本。

2.3.4 FormatFloat()

func FormatFloat(f float64, fmt byte, prec, bitSize int) string

函式將浮點數表示為字串並返回。

bitSize表示f的來源型別(32:float32、64:float64),會據此進行舍入。

fmt表示格式:’f’(-ddd.dddd)、’b’(-ddddp±ddd,指數為二進位制)、’e’(-d.dddde±dd,十進位制指數)、’E’(-d.ddddE±dd,十進位制指數)、’g’(指數很大時用’e’格式,否則’f’格式)、’G’(指數很大時用’E’格式,否則’f’格式)。

prec控制精度(排除指數部分):對’f’、’e’、’E’,它表示小數點後的數字個數;對’g’、’G’,它控制總的數字個數。如果prec 為-1,則代表使用最少數量的、但又必需的數字來表示f。

2.3.5 程式碼示例

	//res := strconv.FormatBool(true)
	//res := strconv.FormatFloat(3.14150, 'f', -1, 64) // prec為-1表示使用最少數量表示,最後的0就省略了,如果prec為1,表示小數點後1位
	//res := strconv.FormatInt(-2, 16)
	res := strconv.FormatUint(17, 16)
	fmt.Printf("型別為:%T,值為:%s",res,res)

2.4 其他

2.4.1 isPrint()

func IsPrint(r rune) bool

返回一個字元是否是可列印的,和unicode.IsPrint一樣,r必須是:字母(廣義)、數字、標點、符號、ASCII空格。

2.4.2 CanBackquote()

func CanBackquote(s string) bool

返回字串s是否可以不被修改的表示為一個單行的、沒有空格和tab之外控制字元的反引號字串。

2.4.3 Append系列

Append類的函式和Format類的函式工作方式類似,只不過是將轉換後的結果追加到一個slice中

將其他型別轉換成字串後append到一個slice中:AppendBool()、AppendFloat()、AppendInt()、AppendUint()

	b := []byte("99的十進位制是:")
	// 將轉換為10進位制的string,追加到slice中
	b = strconv.AppendInt(b, 99, 10)
	fmt.Println(string(b))

2.4.4 程式碼

	//一個字元是否是可列印的
	res:=strconv.IsPrint('n')  // true 可列印
	res:=strconv.IsPrint('\n')  // false  不可列印

	//是否可以不被修改的表示為一個單行的、沒有空格和tab之外控制字元的反引號字串
	res:=strconv.CanBackquote(`lqz is Nb`) // true
	res:=strconv.CanBackquote(`lqz is
Nb`) // false :因為帶回車
	fmt.Println(res)