Go資料型別轉化

2021-08-28 10:21:30 字數 3341 閱讀 8264

go是一種強型別語言,同時也屬靜態型別語言。

強型別語言也稱為強型別定義語言,是一種總是強制型別定義的語言。也就是說一旦乙個變數被指定了某個資料型別,如果不經過強制轉化,那麼它就永遠是這個資料型別了。例如下面的**中,開始處變數str的型別是字串,接著又賦給變數str乙個int型別的值,這是不允許的。

package main

import "fmt"

func main()

# command-line-arguments

.\test.go:7:6: cannot use 123 (type int) as type string in assignment

一種在編譯時,資料型別是固定的語言,在使用資料之前,必須首先定義資料型別,相當於在使用它們之前,首先要為它們分配好記憶體環境。靜態型別語言的主要優點在於其結構非常規範,便於除錯,方便型別安全。缺點是為此需要寫更多的型別相關**,導致不便於閱讀,不清晰明了。

簡單了解下go變數的宣告,主要有以下幾種:

var x int  //只宣告,沒有設定初始化值。這種情況下會go會給出預設值,具體介紹可檢視[go語言變數宣告後的預設值](

var y = 1.2 //宣告的同時提供初始化值,這種情況可省略變數型別,由編譯器自動推斷

func main()

相同基礎型別之間的轉化

對於每乙個型別t,都有乙個對應的型別轉化操作t(x)。用於將x轉化為t型別(如果t是指標型別,可能會需要用小括弧包裹t,比如(*int)(0))。只有當兩個型別的底層基礎型別相同時,才允許這種型別操作,或者是兩者都是指向相同底層結構的指標型別,這些轉化只改變型別而不會影響值本身。如果x可以賦值給t型別的值,那麼x必然也可以被轉化為t型別。

例如go語言的數值型別包括:整形數、浮點數和負數,每種數值型別都決定了對應的大小範圍和是否支援正負符號。例如下面變數a在開始處的型別為float64,但是通過上面所說的型別轉化操作,順利的將它轉化成uint32型別。

package main

import (

"fmt"

"reflect"

)func main()

那麼如果將上面**中的uint32換成string,編譯就會報錯,因為它們屬於不同的底層基礎型別。

# command-line-arguments

.\test.go:11:13: cannot convert a (type float64) to type string

注意:許多整形數之間的相互轉化並不會改變量值,它們只是告訴編譯器如何解釋這個值。但是對於將乙個大尺寸的整數型別轉為乙個小尺寸的整數型別,或是將乙個浮點數轉為整數,可能改變量值或丟失精度。比如上面的例子,浮點數到整數的轉化將丟失任何小數部分,然後向數軸零方向截斷。

同理,相互之間可以轉化的型別有:

1.字元型別和字串型別

package main

import (

"fmt"

"reflect"

)func main()

上面**實際上就是byte型別和string型別之間的轉化,那麼string型別要轉化成byte型別也是可以轉化的,只不過此時string對應的型別就應該是byte型別。例如:

func main()
從執行的情況來看,變數b的型別是uint8,也就是byte型別。代表utf-8字串,byte型別還有一種是rune,代表unicode字元。

不同基礎型別之間的轉化

對於不同的基礎型別之間的轉化,go提供了strconv包。它實現了字串與其他基本資料型別之間的轉化。其中最常用的數值轉化函式是atoiitoa,簡單了解下它的使用。atoi方法可以將字串型別的數值直接轉化為int型別的數值,而itoa可以將int型別的數值轉化為string型別的值。

package main

import (

"fmt"

"strconv"

"reflect"

)func main()

fmt.println(b, reflect.typeof(b))

c := strconv.itoa(b)

fmt.println(c, reflect.typeof(c))

}

1.parsebool函式

此方法用來解析字串型別的代表的布林值,此方法中會將"1", "t", "t", "true", "true", "true"全部轉化為true,將"0", "f", "f", "false", "false", "false"全部轉化為false。而對於其他值,都會返回false,並返回乙個錯誤。

package main

import (

"fmt"

"strconv"

"reflect"

)func main()

fmt.println(a,reflect.typeof(a))

}

上面**編譯時就會報錯strconv.parsebool: parsing "3": invalid syntax

2.formatbool函式

此方法會將bool型別轉化為string型別的值,例如:

func main()
3.parsefloat函式

此方法將string型別轉化成float64的值,其中第二個引數用來控制返回時數值的精度,32標識float32,64表示float64。

當精度是32時,結果返回的型別仍然是float64,但是它可以在不改變其值的情況下轉化為float32。

4.formatfloat函式

此方法將float64型別的變數轉化為string型別,總共需要傳入四個引數。第乙個是轉化的數值,第二個是控制列印時的格式,第三個是特殊的精度,最後乙個也是特殊的精度。

func formatfloat(f float64, fmt byte, prec, bitsize int) string {}
該包中還有一些其他的型別轉化函式,如果感興趣,可以下去再仔細了解一下。

資料型別轉化

自己寫的,可能有某些bug,希望大家提出來 函式介紹 進製轉換 函式說明 10進製轉換16進製制 輸入引數 需要轉換的10進製數data 輸出引數 無 int value convert 10 16 int m data return m value 函式介紹 數值轉換 函式說明 對大於10的數進行...

go 資料型別

資料型別陣列 切片map struct 函式介面 channel 指標陣列 類似php索引陣列,長度固定,值型別唯一 func main 宣告並初始化陣列arr2,長度自動匹配 fmt.printf t arr1 fmt.printf t arr2 切片 動態陣列 func main 擷取 s3 s...

go資料型別

在 go 程式語言中,資料型別用於宣告函式和變數。資料型別的出現是為了把資料分成所需記憶體大小不同的資料,程式設計的時候需要用大資料的時候才需要申請大記憶體,就可以充分利用記憶體。go 語言按類別有以下幾種資料型別 序號型別和描述 1布林型 布林型的值只可以是常量 true 或者 false。乙個簡...