静的型付けと動的型付けの基本的な違い
静的型付けと動的型付けの基本的な違い
静的型付け(Go、Java、C++など)
変数の型が コンパイル時に決まる。
一度決めた型は、プログラムが動作する間、基本的に変わらない。
型に関する間違い(例:型の不一致など)は、コンパイル時にエラーとして発見される。
動的型付け(Python、JavaScriptなど)
変数の型は 実行時に決まる。
同じ変数に異なる型の値を入れることが可能。
型の間違いによるエラーは、実行時までわからないことが多い。
Goの静的型付けの例
Goでは、変数を宣言する際に型を指定します。例えば:
package main
import "fmt"
func main() {
var age int = 20 // 変数 age は int 型
fmt.Println(age)
// age = "twenty" // エラー!int 型に文字列は代入できない
}
上記の例では、age は int 型なので、文字列など他の型を代入しようとすると コンパイル時にエラー になります。これが静的型付けの特徴です。
動的型付けの例(Python)
同じ例を動的型付けの言語(例えば Python)で書くと:
age = 20 # 初めは int 型
print(age)
age = "twenty" # 途中で文字列型に変更できる
print(age)
Pythonでは、変数 age に異なる型の値を代入してもエラーにはなりません。Goと違って型のチェックが 実行時 に行われます。
静的型付けと動的型付けのメリット・デメリット
静的型付け(Go) 動的型付け(Python、JavaScript)
メリット
- コンパイル時に型の間違いを検出できる - コードが柔軟で短く書ける
- 大規模開発で型の整合性を保ちやすい - 型を気にせず素早く試作や開発ができる
デメリット
- 型指定が煩雑になることがある - 実行してみるまで型のエラーがわからない
- 柔軟性が少ない(型変換が必要な場合も) - 大規模なプロジェクトではバグが増えやすい
Goで柔軟な型の扱い:interface{}
Goは静的型付けですが、必要に応じて 柔軟に型を扱える仕組み もあります。その代表例が interface{}(空のインターフェース) です。これは 任意の型の値を受け入れる 型で、動的な言語に少し近い使い方ができます。
package main
import "fmt"
func printValue(value interface{}) {
fmt.Println(value)
}
func main() {
printValue(42) // int 型でも OK
printValue("Hello") // string 型でも OK
printValue(3.14) // float 型でも OK
}
ただし、型の安全性を確保するために型アサーションや型スイッチを使う必要があるため、完全に動的なわけではありません。
結論
Go は 静的型付け なので、型に関する問題が実行前にコンパイル時に検出されるため、大規模開発に向いています。
動的型付け言語(Python など)は柔軟で素早い開発に向いていますが、型エラーの検出が遅くなる可能性があります。
Goの強みは、静的型付けの安全性を維持しつつ、interface{}などの柔軟な構造で動的型付けに近いこともできる点です。
Discussion