ホームページ バックエンド開発 Golang Go 言語のデータ型変換チュートリアル

Go 言語のデータ型変換チュートリアル

Dec 30, 2019 pm 05:49 PM
言語を移動

Go 言語のデータ型変換チュートリアル

#Go はデータの暗黙的な型変換を実行せず、変換操作は手動でのみ実行できます。 go言語でのデータ型変換の方法を見てみましょう。 。

簡単な変換操作

データ型を変換する方法は非常に簡単です。

valueOfTypeB = typeB(valueOfTypeA)
ログイン後にコピー

例:

// 浮点数
a := 5.0

// 转换为int类型
b := int(a)
ログイン後にコピー

Go では、同じ基礎構造を持つ 2 つの型間の変換が可能です。例:

// 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. すべてのデータ型を変換できるわけではありません。たとえば、アルファベット形式の文字列型「abcd」は int に変換できます。 必ず失敗します。

2. 低精度を高精度に変換するのは安全ですが、高精度の値を低精度に変換すると精度が失われます。たとえば、int32 を変換します。 int16 と float32 を int

3 に変換します。この単純な変換メソッドでは、int (float) と string を相互に変換することはできません。大きな型間で変換するには、以下を使用できます。 strconv パッケージが提供する関数

strconv

strconv パッケージは、文字列と単純なデータ型の間の型変換関数を提供します。単純型は文字に変換できます 文字列は他の単純な型に変換することもできます。

このパッケージには多くの関数が用意されており、大まかにいくつかのカテゴリに分類されます:

1. 文字列を int に変換: Atoi()

2. int を文字列に変換:itoa ()

3. ParseTP クラス関数は文字列を TP 型に変換します: ParseBool()、ParseFloat()、ParseInt()、 ParseUint()。文字列を他の型に変換すると失敗する可能性があるため、これらの関数には変換するかどうかを示す 2 番目の戻り値があります。 変換成功

4. FormatTP クラス関数は他の型を文字列に変換します: FormatBool()、FormatFloat()、FormatInt()、 FormatUint()

5. AppendTP クラス関数は、TP を文字列に変換し、それをスライスに追加するために使用されます: AppendBool(), AppendFloat()、AppendInt()、AppendUint()

および基本的に使用されないその他の関数については、公式マニュアルを参照してください: go doc strconv または https://golang.org/pkg/strconv/。

一部の型を変換できない場合、エラーが報告されます。返されるエラーは、strconv パッケージで独自に定義されたエラー タイプです。 2種類あります エラー:

var ErrRange = errors.New("value out of 

range")
var ErrSyntax = errors.New("invalid syntax")
ログイン後にコピー

たとえば、Atoi("a") を使用して "a" を int 型に変換することは当然失敗します。もし Print はエラー情報を出力し、次のように表示されます。

strconv.Atoi: parsing "a": invalid 

syntax
ログイン後にコピー

文字列と整数の間の変換

最も一般的なのは、文字列と整数の間の変換です:

1. int を string に変換:itoa()

// Itoa(): int -> string
println("a" + strconv.Itoa(32))  // a32
ログイン後にコピー

2.string を int に変換:Atoi()

func Atoi(s string) (int, error)
ログイン後にコピー

string は int に変換できない場合があるため、この関数には 2 つの戻り値があります。最初の戻り値は int に変換されます 値を返し、2 番目の戻り値によって変換が成功したかどうかが決まります。

// 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()。

他の型への文字列変換は失敗する可能性があるため、これらの関数には 2 つの戻り値があり、最初の戻り値が保存されます。 変換された値、つまり 2 番目の戻り値によって、変換が成功したかどうかが決まります。

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 であることを示します。

基本パラメーターは、指定された文字列の解析に使用する基本メソッドを示します。有効な値は 0 および 2 ~ 36 です。ベース=0の場合 、文字列のプレフィックスがどの塩基を解析するかを決定するために使用されることを示します。0x で始まるものは 16 進数で解析され、0 で始まるものは解析されます。 これは 8 進数形式で解析され、その他は 10 進数形式で解析されます。

「-42」を 10 進数モードで解析し、int64 型として保存します:

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

64)
ログイン後にコピー

「23」を 5 進数モードで解析し、int64 型として保存します:

i, _ := strconv.ParseInt("23", 5, 64)
println(i)    // 13
ログイン後にコピー

Because 5 桁システムでは、23 は 2 回繰り上げて 3 を加算することを意味するため、対応する 10 進数は 5*2 3=13 となります。

23 を 16 進数で解析し、int64 型として保存します。

i, _ := strconv.ParseInt("23", 16, 64)
println(i)    // 35
ログイン後にコピー

16 進数では、23 は 2 回繰り上げて 3 を加算することを意味するため、対応する 10 進数は 16 *2 3=35 になります。

23 を 16 進数で解析し、int64 型として保存します。

i, _ := strconv.ParseInt("23", 15, 64)
println(i)    // 33
ログイン後にコピー

16 進数では、23 は 2 回繰り上げて 3 を加算することを意味するため、対応する 10 進数は 15 *2 3=33 になります。

Format クラス関数

指定された型を文字列型にフォーマットします: 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() には 2 つのパラメータがあります:

func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
ログイン後にコピー

2 番目のパラメータの Base は、最初のパラメータを変換する基数を指定します。有効な値は 2<=base< ;=36 です。 。指定する場合 の基本桁が 10 より大きい場合、10 を超える値は a ~ z の文字で表されます。たとえば、16 進数では、10 ~ 15 の数字がそれぞれ使用されます。 a~fは16進法で値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 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? Apr 02, 2025 pm 04:00 PM

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...

See all articles