# 数据类型

## 类型系统

Fig 语言是动态类型语言，运行时进行类型检查。

## 基本类型

### Null 类型
表示空值，只有一个值 `null`。
```dart
var a = null;
```

### Int 类型
64位有符号整数。
```go
var x = 42;
var y = -100;
```

### Double 类型
双精度浮点数。
```go
var pi = 3.14;
var speed = 2.998e8;
```

### String 类型
字符串。
```go
var s1 = "Hello";
```

### Bool 类型
布尔值，`true` 或 `false`。
```go
var yes = true;
var no = false;
```

## 复合类型

### List 类型
有序集合。
```go
var list = [1, 2, 3];
var mixed = [1, "text", true];
```
可以通过 **length()** 方法获取长度，返回Int
通过 **get()** 方法获取指定下标，不存在的下标返回null

### Map 类型
键值对集合。
```go
var map = {"key": "value", "num": 42};
```

通过 **get()** 方法获取指定下标，不存在的下标返回 `null`

### Function 类型
函数。
```go
var f = func(x, y) { return x + y; };
```

## 自定义类型

### 结构体定义
```rust
struct Person {
    name: String;
    age: Int;
}
```

默认字段为私有，如需声明为外部可见的字段，使用 public关键字
如
```go
struct Person {
    public name: String;
    public age: Int;

    public func greeting()
    {
        io.println("hello!");
    }
}
```

### 创建实例
使用 `new` 关键字：
```go
var p = new Person {name: "Alice", age: 20};
```

支持三种初始化方式：
1. 命名参数：`new Person {name: "Alice", age: 20}`
2. 位置参数：`new Person {"Alice", 20}`
3. 简写方式：`new Person {name, age}`（使用同名变量）

## 类型操作

### 类型检查
使用 `is` 运算符：
```go
var x = "hello";
io.println(x is String);  // true

var p = new Person {name: "Alice", age: 20};
io.println(p is Person);  // true
```

### 获取类型
使用 `value.type()` 函数(获取内部类型)：
```go
import std.value;

var num = 42;
var str = "hello";
var lst = [1, 2, 3];

io.println(value.type(num));  // 获取 num 的类型
io.println(value.type(str));  // 获取 str 的类型  
io.println(value.type(lst));  // 获取 lst 的类型
```

## 类型转换

### 转换函数
通过 `std.value` 模块：
```go
import std.value;

var str = value.string_from(42);      // "42"
var num = value.int_parse("123");     // 123
var dbl = value.double_parse("3.14"); // 3.14
```

## 错误处理

### try-catch 语法
```rust
try
{
    // 可能抛出异常的代码
}
catch(e: ErrorType)
{
    // 处理特定类型的错误
}
catch(e: AnotherError)
{
    // 处理另一种错误
}
```