Go における型キャストと変換の包括的なガイド

王林
リリース: 2024-08-20 07:00:31
オリジナル
518 人が閲覧しました

A Comprehensive Guide to Type Casting and Conversions in Go

Go は Golang とも呼ばれ、静的型付け言語です。これは、すべての変数の型がコンパイル時に既知であることを意味し、コードの安全性と予測可能性を提供します。ただし、これには、ある型から別の型への変換が明示的かつ意図的に行われる必要もあります。この記事では、基本的な数値変換からより複雑なインターフェイスやポインタの変換まで、Go で利用できるさまざまな型のキャストと変換のメカニズムについて説明します。

1. 基本的な型変換

Go では、整数、浮動小数点数、文字列などの基本型間の変換が可能ですが、これらの変換は明示的に行う必要があります。

数値型

異なる数値型間の変換は簡単ですが、明示的に行う必要があります:

var i int = 42
var f float64 = float64(i)  // int to float64
var u uint = uint(i)        // int to uint
ログイン後にコピー

この例では、int を float64 と uint に変換します。 Go は自動 (暗黙的) 型変換を実行しないため、これらの変換は明示的です。

文字列とバイトスライス

Go 文字列は不変ですが、変更可能なバイト スライス ([]byte) との間で変換できます。

var s string = "hello"
var b []byte = []byte(s)   // string to []byte
var s2 string = string(b)  // []byte to string
ログイン後にコピー

同様に、文字列とルーン スライス ([]rune) の間で変換できます。ここで、rune は int32 の型エイリアスです。

var r []rune = []rune(s)   // string to []rune
var s3 string = string(r)  // []rune to string
ログイン後にコピー

2. カスタム型変換

Go では、既存の型に基づいて独自の型を定義できます。カスタム型とその基になる型の間の変換は明示的に行われます:

type MyInt int
var i int = 10
var mi MyInt = MyInt(i)   // int to MyInt
var i2 int = int(mi)      // MyInt to int
ログイン後にコピー

この明示的な変換は、コンパイラーがコードの安全性を確認できるようにするために必要です。

3. ポインタ変換

Go のポインタは変数のメモリ アドレスを参照します。値とそのポインタの間で変換できます:

var x int = 42
var p *int = &x     // int to *int (pointer to int)
var y int = *p      // *int to int (dereferencing)
ログイン後にコピー

4. インターフェースの型変換

Go のインターフェイスは、一連のメソッドを定義するために使用されます。具体的な型とインターフェイスの間で変換できます。

var a interface{} = 42    // int to interface{}
var b int = a.(int)       // interface{} to int (type assertion)
ログイン後にコピー

型アサーション

型アサーションは、インターフェイスの具体的な値へのアクセスを提供します。

if v, ok := a.(int); ok {
    fmt.Println("a is an int:", v)
}
ログイン後にコピー

タイプスイッチ

タイプスイッチを使用すると、インターフェイスの動的タイプに基づいてさまざまなアクションを実行できます。

switch v := a.(type) {
case int:
    fmt.Println("a is an int:", v)
case string:
    fmt.Println("a is a string:", v)
default:
    fmt.Println("a is of unknown type")
}
ログイン後にコピー

5. 安全でない変換

安全でないパッケージを使用すると、Go のタイプ セーフをバイパスでき、本来は不正となる変換が可能になります。

import "unsafe"

var i int = 42
var p *int = &i
var fp *float64 = (*float64)(unsafe.Pointer(p))  // *int to *float64
ログイン後にコピー

警告: 安全でない変換は、未定義の動作を引き起こす可能性があるため、慎重に使用し、絶対に必要な場合にのみ使用してください。

6. チャネルタイプの変換

チャネルは Go の強力な機能であり、ゴルーチン間の通信を可能にします。双方向チャネルと単方向チャネルの間で変換できます:

ch := make(chan int)
var sendOnlyChan chan<- int = ch  // bidirectional to send-only
var recvOnlyChan <-chan int = ch  // bidirectional to receive-only
ログイン後にコピー

7. 構造体と配列の変換

同一のレイアウトを持つ構造体または配列間の変換には、明示的なキャストが必要です。

type Point struct {
    X, Y int
}

type Coord struct {
    X, Y int
}

var p Point = Point{1, 2}
var c Coord = Coord(p)  // Convert Point to Coord (same field types)
ログイン後にコピー

8. スライス変換

スライスは配列への参照であり、同じタイプのスライス間で変換することはできますが、異なるタイプのスライス間で変換するには明示的な変換が必要です。

var a []int = []int{1, 2, 3}
var b []int = a[1:]  // Convert a slice to another slice of the same type
ログイン後にコピー

9. Nil インターフェース変換

Go の nil 値は、任意のインターフェイス タイプに割り当てることができます。

var x interface{} = nil
var y error = nil
ログイン後にコピー

10. 関数の型変換

署名に互換性がある場合、Go 関数はさまざまな型に変換できます。

type FuncType func(int) int

func square(x int) int {
    return x * x
}

var f FuncType = FuncType(square)  // Convert function to FuncType
ログイン後にコピー

11. 配列からスライスへの変換

配列からスライスを作成できます。これは基本的に配列への参照です。

var arr [5]int = [5]int{1, 2, 3, 4, 5}
var sl []int = arr[:]  // Convert array to slice
ログイン後にコピー

結論

Go の型キャストと変換は設計上明示的であるため、コードがより安全で理解しやすくなります。 Go は明示的な変換を要求することで、他のプログラミング言語で一般的な、暗黙的な型強制によって発生する可能性のある微妙なバグを防ぐのに役立ちます。これらの変換を理解し、正しく使用することは、堅牢で効率的な Go プログラムを作成するために非常に重要です。

以上がGo における型キャストと変換の包括的なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!