Go は Golang とも呼ばれ、静的型付け言語です。これは、すべての変数の型がコンパイル時に既知であることを意味し、コードの安全性と予測可能性を提供します。ただし、これには、ある型から別の型への変換が明示的かつ意図的に行われる必要もあります。この記事では、基本的な数値変換からより複雑なインターフェイスやポインタの変換まで、Go で利用できるさまざまな型のキャストと変換のメカニズムについて説明します。
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
Go では、既存の型に基づいて独自の型を定義できます。カスタム型とその基になる型の間の変換は明示的に行われます:
type MyInt int var i int = 10 var mi MyInt = MyInt(i) // int to MyInt var i2 int = int(mi) // MyInt to int
この明示的な変換は、コンパイラーがコードの安全性を確認できるようにするために必要です。
Go のポインタは変数のメモリ アドレスを参照します。値とそのポインタの間で変換できます:
var x int = 42 var p *int = &x // int to *int (pointer to int) var y int = *p // *int to int (dereferencing)
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") }
安全でないパッケージを使用すると、Go のタイプ セーフをバイパスでき、本来は不正となる変換が可能になります。
import "unsafe" var i int = 42 var p *int = &i var fp *float64 = (*float64)(unsafe.Pointer(p)) // *int to *float64
警告: 安全でない変換は、未定義の動作を引き起こす可能性があるため、慎重に使用し、絶対に必要な場合にのみ使用してください。
チャネルは Go の強力な機能であり、ゴルーチン間の通信を可能にします。双方向チャネルと単方向チャネルの間で変換できます:
ch := make(chan int) var sendOnlyChan chan<- int = ch // bidirectional to send-only var recvOnlyChan <-chan int = ch // bidirectional to receive-only
同一のレイアウトを持つ構造体または配列間の変換には、明示的なキャストが必要です。
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)
スライスは配列への参照であり、同じタイプのスライス間で変換することはできますが、異なるタイプのスライス間で変換するには明示的な変換が必要です。
var a []int = []int{1, 2, 3} var b []int = a[1:] // Convert a slice to another slice of the same type
Go の nil 値は、任意のインターフェイス タイプに割り当てることができます。
var x interface{} = nil var y error = nil
署名に互換性がある場合、Go 関数はさまざまな型に変換できます。
type FuncType func(int) int func square(x int) int { return x * x } var f FuncType = FuncType(square) // Convert function to FuncType
配列からスライスを作成できます。これは基本的に配列への参照です。
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 サイトの他の関連記事を参照してください。