「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go における型キャストと変換の包括的なガイド

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

2024 年 8 月 30 日に公開
ブラウズ:881

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



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 プログラムを作成するために非常に重要です。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/zakarichahboun/a-comprehensive-guide-to-type-casting-and-conversions-in-go-26di?1 侵害がある場合は、study_golang@163 までご連絡ください。 .comを削除してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3