検索
ホームページバックエンド開発Golanggolangでデータ型変換を行う方法

golangでデータ型変換を行う方法

Nov 22, 2022 pm 06:38 PM
gogolang言語を移動

golang には暗黙的な型変換はありません。すべての型変換は、構文 "valueOfTypeB = typeB(valueOfTypeA)" を使用して明示的に宣言する必要があります。型変換は定義が正しい場合にのみ成功するため、値の範囲が大きい型から値の範囲が小さい型に変換すると、精度の低下 (切り捨て) が発生します。

golangでデータ型変換を行う方法

このチュートリアルの動作環境: Windows10 システム、GO 1.11.2、thinkpad t480 コンピューター。

Go 言語のデータ型変換

型変換は、値がある型から別の型に変換されるときに発生します。 c/c や Java などの静的言語では暗黙的な型変換が提供されますが、golang のような強力な型システムでは異なり、Golang は自動型変換や暗黙的な型変換をサポートしていません。

Go 言語には暗黙的な型変換がないため、すべての型変換は明示的に宣言する必要があります。

valueOfTypeB = typeB(valueOfTypeA)

の意味は次のとおりです。 型 B の値 = 型 B (値型 A)

例:

a := 5.0
b := int(a)

型変換は、定義が正しい場合にのみ成功します。たとえば、範囲が狭い値から型変換への型変換です。値の範囲が大きい型 (int16 を int32 に変換)。より大きな範囲の型からより小さな範囲の型に変換するとき (int32 から int16 または float32 から int に変換)、精度の損失 (切り捨て) が発生します。

同じ基礎となる型の変数のみを相互に変換できます (int16 型を int32 型に変換するなど)。異なる基礎となる型の変数を相互に変換すると、コンパイル エラーが発生します。 bool 型を int 型に変換します).):

package main
import (
        "fmt"
        "math"
)
func main() {
        // 输出各数值范围
        fmt.Println("int8 range:", math.MinInt8, math.MaxInt8)
        fmt.Println("int16 range:", math.MinInt16, math.MaxInt16)
        fmt.Println("int32 range:", math.MinInt32, math.MaxInt32)
        fmt.Println("int64 range:", math.MinInt64, math.MaxInt64)
        // 初始化一个32位整型值
        var a int32 = 1047483647
        // 输出变量的十六进制形式和十进制值
        fmt.Printf("int32: 0x%x %d\n", a, a)
        // 将a变量数值转换为十六进制, 发生数值截断
        b := int16(a)
        // 输出变量的十六进制形式和十进制值
        fmt.Printf("int16: 0x%x %d\n", b, b)
        // 将常量保存为float32类型
        var c float32 = math.Pi
        // 转换为int类型, 浮点发生精度丢失
        fmt.Println(int(c))
}

コードの説明は次のとおりです:

  • 行 11 ~ 14 は、いくつかの一般的な整数の数値範囲を出力します。種類。

  • 17 行目で、int32 型の変数 a を宣言し、初期化します。

  • 19 行目では、fmt.Printf の %x 動詞を使用して値を 16 進形式で出力しており、変換前の a の 32 ビット値を出力しています。

  • 22行目、aの値をint16型に変換、つまり32ビット符号付き整数型から16ビット符号付き整数型に変換します。 type 値の範囲が int32 型より小さいため、値は切り捨てられます (精度が失われます)。

  • 行 24 は、変換された a 変数値 (b の値) を出力します。これも 16 進数と 10 進数の形式で出力されます。

  • 行 27, math.Pi は math パッケージの定数です。デフォルトでは型がありません。参照される実際の型に基づいて自動的に推定されます。ここで math は.Pi は変数.c に代入されているため、型は float32 です。

  • 29行目、float32をint型に変換して出力します。

コード出力は次のとおりです。

int8 range: -128 127
int16 range: -32768 32767
int32 range: -2147483648 2147483647
int64 range: -9223372036854775808 9223372036854775807
int32: 0x3e6f54ff 1047483647
int16: 0x54ff 21759
3

出力結果によると、16 ビット符号付き整数の範囲は -32768 ~ 32767 で、その値は変数 a、1047483647 はこの範囲内にありません。 1047483647 の対応する 16 進値は 0x3e6f54ff ですが、int16 型に変換すると長さが半分に短縮、つまり 16 進数で半分に切られて 0x54ff となり、対応する 10 進値は 21759 となります。

浮動小数点数を整数に変換すると、小数部分が削除され、整数部分のみが残ります。

型変換の練習

実戦1

package main

import (
   "fmt"
)

// 演示 golang 中基本数据类型的转换
func main() {
   var i int32 = 100
   // 将 i => float
   var n1 float32 = float32(i)
   var n2 int8 = int8(i)
   var n3 int64 = int64(i) // 低精度 => 高精度
   fmt.Printf("i=%v n1=%v n2=%v n3=%v \n", i, n1, n2, n3)
   // 被转换的是变量存储的数据(即值),变量本身的数据类型并没有变化
   fmt.Printf("i type is %T\n", i) // int32
   // 在转换中,比如将 int64  转成 int8 (-128---127) ,编译时不会报错,
   // 只是转换的结果是按溢出处理,和我们希望的结果不一样
   var num1 int64 = 999999
   var num2 int8 = int8(num1)
   fmt.Println("num2=", num2)
}

テスト結果

i=100 n1=100 n2=100 n3=100
i type is int32
num2= 63

実戦 2

package main
import (
   "fmt"
   _ "fmt" // 如果我们没有使用到一个包,但是有想去掉,前面加一个 _ 表示忽略
)

func main() {
   // 小练习
   var n1 int32 = 12
   var n2 int64
   var n3 int8
   // n2 = n1 + 20  // int32 ---> int64 错误
   // n3 = n1 + 20  // int32 ---> int8 错误
   n2 = int64(n1) + 20  // 正确
   n3 = int8(n1) + 20  // 正确
   fmt.Println("n2=", n2, "n3=", n3)
}

テスト結果

n2= 32 n3= 32

#実戦 3

package main

import (
   "fmt"
   _ "fmt" // 如果我们没有使用到一个包,但是有想去掉,前面加一个 _ 表示忽略
)

func main() {
   var n1 int32 = 12
   var n3 int8
   var n4 int8
   n4 = int8(n1) + 127 // 编译通过,但是结果 不是 127+12 ,按溢出处理
   n3 = int8(n1) + 128 // 编译不过
   fmt.Println(n4, n3)
}
テスト結果

# command-line-arguments
.\main.go:23:16: constant 128 overflows int8
プログラミング関連の知識については、

プログラミング ビデオ をご覧ください。 !

以上がgolangでデータ型変換を行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
GOプログラミング言語を備えたスケーラブルなシステムを構築しますGOプログラミング言語を備えたスケーラブルなシステムを構築しますApr 25, 2025 am 12:19 AM

goisidealforbuildingscalablessystemsduetoitssimplicity、効率性、およびビルド・インコンカレンシsupport.1)

GOでINIT機能を効果的に使用するためのベストプラクティスGOでINIT機能を効果的に使用するためのベストプラクティスApr 25, 2025 am 12:18 AM

intionSingOrunautomaticallyは()andareuseforstingupenments andinitializingvariables.usemforsimpletasks、回避効果を回避し、測定可能性を測定することを検討します。

GOパッケージのINIT機能の実行順序GOパッケージのINIT機能の実行順序Apr 25, 2025 am 12:14 AM

goinitializeSpackages intheordertheyareimport extionsitions withinitionsiteintheirdefinition ordord、およびfilenamesdetermineTheOordCrossMultiplefiles.thisprocesccanbeandeanded by -dependenciessedieSiesは、このマイレアドカンフレシニティン化の対象となります

Goでカスタムインターフェイスを定義および使用しますGoでカスタムインターフェイスを定義および使用しますApr 25, 2025 am 12:09 AM

custominterfacesingoarecrucialforwritingfficable、maintable、a​​ndtatablecode.theyeNabledeveloveerStofofofovioroverimplementation、拡張、methodsodsignaturesthattypespessmustimment、interfaceforoderueusavelya

GOのモッキングとテストのためにインターフェイスを使用しますGOのモッキングとテストのためにインターフェイスを使用しますApr 25, 2025 am 12:07 AM

シミュレーションとテストにインターフェイスを使用する理由は、インターフェイスにより、実装を指定せずに契約の定義を可能にし、テストをより孤立し、メンテナンスしやすくするためです。 1)インターフェイスの暗黙的な実装により、モックオブジェクトを簡単に作成できます。これにより、テストの実際の実装を置き換えることができます。 2)インターフェイスを使用すると、ユニットテストでのサービスの実際の実装を簡単に置き換えることができ、テストの複雑さと時間を短縮できます。 3)インターフェイスによって提供される柔軟性により、さまざまなテストケースのシミュレートされた動作の変更が可能になります。 4)インターフェイスは、テスト可能なコードを最初から設計し、コードのモジュール性と保守性を向上させるのに役立ちます。

GOのパッケージ初期化にinitを使用しますGOのパッケージ初期化にinitを使用しますApr 24, 2025 pm 06:25 PM

Goでは、init関数はパッケージの初期化に使用されます。 1)init関数は、パッケージの初期化時に自動的に呼び出され、グローバル変数の初期化、接続の設定、構成ファイルの読み込みに適しています。 2)ファイルの順序で実行できる複数のinit関数がある場合があります。 3)それを使用する場合、実行順序、テストの難易度、パフォーマンスへの影響を考慮する必要があります。 4)副作用を減らし、依存関係の注入を使用し、初期化を遅延させることをお勧めします。

GoのSelectステートメント:マルチプレックスコンカレント操作GoのSelectステートメント:マルチプレックスコンカレント操作Apr 24, 2025 pm 05:21 PM

go'sselectStatementStreamLinesConcurrentProgrambyMultipLexIngoperations.1)Itallow swaitingonMultipleChanneloperations、実行、exectingThefirstreadyone.2)

Go:Context and Waitgroupsの高度な並行性テクニックGo:Context and Waitgroupsの高度な並行性テクニックApr 24, 2025 pm 05:09 PM

コンテキストアンドウェイトグループは、フォーマネングに焦点を合わせており、contextAllowsingSignalingCancellationAndDeadlinesAcrossapiboundariesを採用し、GoroutinesscanSclacefly.2)WaitGroupssynchronizeGoroutines、Allcompletebebroproproproproproproprotinesを保証します

See all articles

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SublimeText3 Mac版

SublimeText3 Mac版

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