> For the complete documentation index, see [llms.txt](https://minilabmemo.gitbook.io/golang-memo/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://minilabmemo.gitbook.io/golang-memo/basic/go-basic/reflection.md).

# Reflection

反射（Reflection）是探知資料自身結構的一種能力，不同的語言提供不同的反射機制

#### 範例

```go
package main

import (
	"fmt"
	"reflect"
)

type Member struct {
	id   int
	name string
	age  int
}

func main() {
	var myInt int = 230
	fmt.Println(reflect.TypeOf(myInt))  //output int
	fmt.Println(reflect.ValueOf(myInt)) //output 230
	fmt.Println(reflect.TypeOf(myInt).Size()) //8
	member := Member{1, "Adam", 100}
	fmt.Println(reflect.TypeOf(member))  //output main.Member  //取得所有元素
	fmt.Println(reflect.ValueOf(member)) //output {1 Adam 100}/獲得值
	//TODO https://openhome.cc/Gossip/Go/Reflect.html 資料的 Kind NumField()
	//反射（Reflection）是探知資料自身結構的一種能力，不同的語言提供不同的反射機制
}
```

### 深度相等判斷 <a href="#id-133-shi-li-shen-du-xiang-deng-pan-duan" id="id-133-shi-li-shen-du-xiang-deng-pan-duan"></a>

來自reflect包的DeepEqual函數

* 可以支持任意的數據類型
* 但nil值的map和非nil值但是空的map視作不相等，同樣nil值的slice 和非nil但是空的slice也是。
* 雖然方便好用但比遍巡比較效率差

| 參考                                                                                     | 筆記                                |
| -------------------------------------------------------------------------------------- | --------------------------------- |
| [13.3. 示例: 深度相等判斷](https://wizardforcel.gitbooks.io/gopl-zh/content/ch13/ch13-03.html) | 用DeepEqual函數比較兩個字符串數組是否相等         |
| [Golang比较两个slice是否相等](https://www.jianshu.com/p/80f5f5173fca)                          | <p>循环遍历比较的方法<br>Benchmark测试效率</p> |
|                                                                                        |                                   |
