首頁 > 後端開發 > Golang > go語言資料型別轉換教程

go語言資料型別轉換教程

發布: 2019-12-31 09:02:53
轉載
2406 人瀏覽過

go語言資料型別轉換教程

Go不會對資料進行隱式的型別轉換,只能手動去執行轉換操作。下面我們來看看在go語言中進行資料型別轉換的方法 。

簡單的轉換操作

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

valueOfTypeB = typeB(valueOfTypeA)
登入後複製

例如:

// 浮点数
a := 5.0

// 转换为int类型
b := int(a)
登入後複製

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

// IT类型的底层是int类型
type IT int

// a的类型为IT,底层是int
var a IT = 5

// 将a(IT)转换为int,b现在是int类型
b := int(5)

// 将b(int)转换为IT,c现在是IT类型
c := IT(b)
登入後複製

但注意:

1、不是所有資料型別都能轉換的,例如字母格式的string型別"abcd"轉換為int 肯定會失敗

2、低精度轉換為高精度時是安全的,高精度的值轉換為低精度時會丟失精度。例如int32轉 換為int16,float32轉換為int

3、這種簡單的轉換方式不能對int(float)和string進行互轉,要跨大型別轉換,可以使用 strconv套件提供的函數

strconv

strconv套件提供了字串與簡單資料型別之間的型別轉換功能。可以將簡單類型轉換為字符 串,也可以將字串轉換為其它簡單型別。

這個套件裡提供了很多函數,大概分成幾類:

1、字串轉int:Atoi()

2、int轉字串: Itoa ()

3、ParseTP類別函數將string轉換為TP型別:ParseBool()、ParseFloat()、ParseInt()、 ParseUint()。因為string轉其它類型可能會失敗,所以這些函數都有第二個回傳值表示是否轉 換成功

4、FormatTP類別函數將其它型別轉string:FormatBool()、FormatFloat()、FormatInt()、 FormatUint()

5、AppendTP類別函數用於將TP轉換成字串後append到一個slice中:AppendBool()、 AppendFloat()、AppendInt()、AppendUint()

還有其他一些基本上用不到的函數,請見官方手冊:go doc strconv或者 https://golang.org/pkg/strconv/。

當有些類型無法轉換時,將報錯,傳回的錯誤是strconv套件中自行定義的error類型。有兩種 錯誤:

var ErrRange = errors.New("value out of 

range")
var ErrSyntax = errors.New("invalid syntax")
登入後複製

例如,使用Atoi("a")將"a"轉換為int類型,自然是不成功的。如果 print輸出err訊息,將顯示:

strconv.Atoi: parsing "a": invalid 

syntax
登入後複製

string和int的轉換

最常見的是字串和int之間的轉換:

1.int轉換為字串:Itoa()

// Itoa(): int -> string
println("a" + strconv.Itoa(32))  // a32
登入後複製

2.string轉換為int:Atoi()

func Atoi(s string) (int, error)
登入後複製

由於string可能無法轉換為int,所以這個函數有兩個傳回值:第一個回傳值是轉換成int的 值,第二個回傳值判斷是否轉換成功。

// Atoi(): string -> int
i,_ := strconv.Atoi("3")
println(3 + i)   // 6
// Atoi()转换失败
i,err := strconv.Atoi("a")
if err != nil {
    println("converted failed")
}
登入後複製

Parse類別函數

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

由於字串轉換為其它類型可能會失敗,所以這些函數都有兩個回傳值,第一個回傳值保存 轉換後的值,第二個回傳值判斷是否轉換成功。

b, err := strconv.ParseBool("true")
f, err := strconv.ParseFloat("3.1415", 64)
i, err := strconv.ParseInt("-42", 10, 64)
u, err := strconv.ParseUint("42", 10, 64)
登入後複製

ParseFloat()只能接收float64型別的浮點數。

ParseInt()和ParseUint()有3個參數:

func ParseInt(s string, base int, bitSize int) 

(i int64, err error)
func ParseUint(s string, base int, bitSize int) (uint64, error)
登入後複製

bitSize參數表示轉換為何位元的int/uint,有效值為0、8、16、32、64。當bitSize=0的時 候,表示轉換為int或uint型別。例如bitSize=8表示轉換後的值的型別為int8或uint8。

base參數表示以什麼進位的方式去解析給定的字串,有效值為0、2-36。當base=0的時候 ,表示根據string的前綴來判斷以什麼進制去解析:0x開頭的以16進制的方式去解析,0開頭的 以8進位方式去解析,其它的以10進位方式解析。

以10進位方式解析"-42",儲存為int64型別:

i, _ := strconv.ParseInt("-42", 10, 

64)
登入後複製

以5進位方式解析"23",儲存為int64型別:

i, _ := strconv.ParseInt("23", 5, 64)
println(i)    // 13
登入後複製

因為5進位的時候,23表示進位了2次,再加3,所以對應的十進位數為5*2 3=13。

以16進位解析23,儲存為int64型別:

i, _ := strconv.ParseInt("23", 16, 64)
println(i)    // 35
登入後複製

因為16進位的時候,23表示進位了2次,再加3,所以對應的十進位數為16 *2 3=35。

以15進位解析23,儲存為int64型別:

i, _ := strconv.ParseInt("23", 15, 64)
println(i)    // 33
登入後複製

因為15進位的時候,23表示進位了2次,再加3,所以對應的十進位數為15 *2 3=33。

Format類別函數

將給定型別格式化為string類型:FormatBool()、FormatFloat()、FormatInt()、 FormatUint()。

s := strconv.FormatBool(true)
s := strconv.FormatFloat(3.1415, 'E', -1, 64)
s := strconv.FormatInt(-42, 16)
s := strconv.FormatUint(42, 16)
登入後複製

FormatInt()和FormatUint()有兩個參數:

func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
登入後複製

第二個參數base指定將第一個參數轉換為多少進位,有效值為2<=base< ;=36。當指定 的進位位大於10的時候,超出10的數值以a-z字母表示。例如16進位時,10-15的數字分別使用 a-f表示,17進位時,10-16的數值分別使用a-g表示。

例如:FormatInt(-42, 16)表示將-42轉換為16進位數,轉換的結果為-2a。

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。

Append类函数

AppendTP类函数用于将TP转换成字符串后append到一个slice中:AppendBool()、 AppendFloat()、AppendInt()、AppendUint()。

Append类的函数和Format类的函数工作方式类似,只不过是将转换后的结果追加到一个 slice中。

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // 声明一个slice
    b10 := []byte("int (base 10):")
    
    // 将转换为10进制的string,追加到slice中
    b10 = strconv.AppendInt(b10, -42, 10)
    fmt.Println(string(b10))

    b16 := []byte("int (base 16):")
    b16 = strconv.AppendInt(b16, -42, 16)
    fmt.Println(string(b16))
}
登入後複製

输出结果:

int (base 10):-42
int (base 16):-2a
登入後複製

更多golang知识请关注golang教 程栏目。

以上是go語言資料型別轉換教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:cnblogs.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板