Unknown il y a 10 ans
Parent
commit
d977e88e8a
10 fichiers modifiés avec 218 ajouts et 218 suppressions
  1. 6 6
      eBook/11.0.md
  2. 52 52
      eBook/11.1.md
  3. 7 7
      eBook/11.2.md
  4. 17 17
      eBook/11.3.md
  5. 16 16
      eBook/11.4.md
  6. 12 12
      eBook/11.5.md
  7. 22 22
      eBook/11.6.md
  8. 34 34
      eBook/11.7.md
  9. 11 11
      eBook/11.8.md
  10. 41 41
      eBook/11.9.md

+ 6 - 6
eBook/11.0.md

@@ -1,9 +1,9 @@
-# 11 接口(Interfaces)与反射(reflection)
+锘�# 11 鎺ュ彛锛圛nterfaces锛変笌鍙嶅皠锛坮eflection锛�
 
-本章介绍 Go 语言中接口和反射的相关内容。
+鏈�珷浠嬬粛 Go 璇�█涓�帴鍙e拰鍙嶅皠鐨勭浉鍏冲唴瀹广€�
 
-## 链接
+## 閾炬帴
 
-- [目录](directory.md)
-- 上一节:[垃圾回收和SetFinalizer](10.8.md)
-- 下一节:[接口是什么](11.1.md)
+- [鐩�綍](directory.md)
+- 涓婁竴鑺傦細[鍨冨溇鍥炴敹鍜孲etFinalizer](10.8.md)
+- 涓嬩竴鑺傦細[鎺ュ彛鏄�粈涔圿(11.1.md)

+ 52 - 52
eBook/11.1.md

@@ -1,12 +1,12 @@
-# 11.1 接口是什么
+锘�# 11.1 鎺ュ彛鏄�粈涔�
 
-Go 语言不是一种 *“传统”* 的面向对象编程语言:它里面没有类和继承的概念。
+Go 璇�█涓嶆槸涓€绉� *鈥滀紶缁熲€�* 鐨勯潰鍚戝�璞$紪绋嬭�瑷€锛氬畠閲岄潰娌℃湁绫诲拰缁ф壙鐨勬�蹇点€�
 
-但是 Go 语言里有非常灵活的 **接口** 概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来 **说明** 对象的行为:如果谁能搞定这件事,它就可以用在这儿。
+浣嗘槸 Go 璇�█閲屾湁闈炲父鐏垫椿鐨� **鎺ュ彛** 姒傚康锛岄€氳繃瀹冨彲浠ュ疄鐜板緢澶氶潰鍚戝�璞$殑鐗规€с€傛帴鍙f彁渚涗簡涓€绉嶆柟寮忔潵 **璇存槑** 瀵硅薄鐨勮�涓猴細濡傛灉璋佽兘鎼炲畾杩欎欢浜嬶紝瀹冨氨鍙�互鐢ㄥ湪杩欏効銆�
 
-接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。
+鎺ュ彛瀹氫箟浜嗕竴缁勬柟娉曪紙鏂规硶闆嗭級锛屼絾鏄�繖浜涙柟娉曚笉鍖呭惈锛堝疄鐜帮級浠g爜锛氬畠浠�病鏈夎�瀹炵幇锛堝畠浠�槸鎶借薄鐨勶級銆傛帴鍙i噷涔熶笉鑳藉寘鍚�彉閲忋€�
 
-通过如下格式定义接口:
+閫氳繃濡備笅鏍煎紡瀹氫箟鎺ュ彛锛�
 
 ```go
 type Namer interface {
@@ -16,35 +16,35 @@ type Namer interface {
 }
 ```
 
-上面的 `Namer` 是一个 **接口类型**。
+涓婇潰鐨� `Namer` 鏄�竴涓� **鎺ュ彛绫诲瀷**銆�
 
-(按照约定,只包含一个方法的)接口的名字由方法名加 `[e]r` 后缀组成,例如 `Printer`、`Reader`、`Writer`、`Logger`、`Converter`等等。还有一些不常用的方式(当后缀`er`不合适时),比如`Recoverable`,此时接口名以`able`结尾,或者以 `I` 开头(像 `.NET` 或 `Java` 中那样)。
+锛堟寜鐓х害瀹氾紝鍙�寘鍚�竴涓�柟娉曠殑锛夋帴鍙g殑鍚嶅瓧鐢辨柟娉曞悕鍔� `[e]r` 鍚庣紑缁勬垚锛屼緥濡� `Printer`銆乣Reader`銆乣Writer`銆乣Logger`銆乣Converter`绛夌瓑銆傝繕鏈変竴浜涗笉甯哥敤鐨勬柟寮忥紙褰撳悗缂€`er`涓嶅悎閫傛椂锛夛紝姣斿�`Recoverable`锛屾�鏃舵帴鍙e悕浠�able`缁撳熬锛屾垨鑰呬互 `I` 寮€澶达紙鍍� `.NET` 鎴� `Java` 涓�偅鏍凤級銆�
 
-Go 语言中的接口都很简短,通常它们会包含0个、最多3个方法。
+Go 璇�█涓�殑鎺ュ彛閮藉緢绠€鐭�紝閫氬父瀹冧滑浼氬寘鍚�0涓�€佹渶澶�3涓�柟娉曘€�
 
-不像大多数面向对象编程语言,在 Go 语言中接口可以有值,一个接口类型的变量或一个 **接口值** :`var ai Namer`,`ai`是一个多字(multiword)数据结构,它的值是 `nil`。它本质上是一个指针,虽然不完全是一回事。指向接口值的指针是非法的,它们不仅一点用也没有,还会导致代码错误。
+涓嶅儚澶у�鏁伴潰鍚戝�璞$紪绋嬭�瑷€锛屽湪 Go 璇�█涓�帴鍙e彲浠ユ湁鍊硷紝涓€涓�帴鍙g被鍨嬬殑鍙橀噺鎴栦竴涓� **鎺ュ彛鍊�** 锛歚var ai Namer`锛宍ai`鏄�竴涓��瀛楋紙multiword锛夋暟鎹�粨鏋勶紝瀹冪殑鍊兼槸 `nil`銆傚畠鏈�川涓婃槸涓€涓�寚閽堬紝铏界劧涓嶅畬鍏ㄦ槸涓€鍥炰簨銆傛寚鍚戞帴鍙e€肩殑鎸囬拡鏄�潪娉曠殑锛屽畠浠�笉浠呬竴鐐圭敤涔熸病鏈夛紝杩樹細瀵艰嚧浠g爜閿欒�銆�
 
 ![](images/11.1_fig11.1.jpg?raw=true)
 
-此处的方法指针表是通过运行时反射能力构建的。
+姝ゅ�鐨勬柟娉曟寚閽堣〃鏄�€氳繃杩愯�鏃跺弽灏勮兘鍔涙瀯寤虹殑銆�
 
-类型(比如结构体)实现接口方法集中的方法,每一个方法的实现说明了此方法是如何作用于该类型的:**即实现接口**,同时方法集也构成了该类型的接口。实现了 `Namer` 接口类型的变量可以赋值给 `ai` (接收者值),此时方法表中的指针会指向被实现的接口方法。当然如果另一个类型(也实现了该接口)的变量被赋值给`ai`,这二者(译者注:指针和方法实现)也会随之改变。
+绫诲瀷锛堟瘮濡傜粨鏋勪綋锛夊疄鐜版帴鍙f柟娉曢泦涓�殑鏂规硶锛屾瘡涓€涓�柟娉曠殑瀹炵幇璇存槑浜嗘�鏂规硶鏄��浣曚綔鐢ㄤ簬璇ョ被鍨嬬殑锛�**鍗冲疄鐜版帴鍙�**锛屽悓鏃舵柟娉曢泦涔熸瀯鎴愪簡璇ョ被鍨嬬殑鎺ュ彛銆傚疄鐜颁簡 `Namer` 鎺ュ彛绫诲瀷鐨勫彉閲忓彲浠ヨ祴鍊肩粰 `ai` 锛堟帴鏀惰€呭€硷級锛屾�鏃舵柟娉曡〃涓�殑鎸囬拡浼氭寚鍚戣�瀹炵幇鐨勬帴鍙f柟娉曘€傚綋鐒跺�鏋滃彟涓€涓�被鍨嬶紙涔熷疄鐜颁簡璇ユ帴鍙o級鐨勫彉閲忚�璧嬪€肩粰`ai`锛岃繖浜岃€咃紙璇戣€呮敞锛氭寚閽堝拰鏂规硶瀹炵幇锛変篃浼氶殢涔嬫敼鍙樸€�
 
-**类型不需要显式声明它实现了某个接口:接口被隐式地实现。多个类型可以实现同一个接口**。
+**绫诲瀷涓嶉渶瑕佹樉寮忓0鏄庡畠瀹炵幇浜嗘煇涓�帴鍙o細鎺ュ彛琚�殣寮忓湴瀹炵幇銆傚�涓�被鍨嬪彲浠ュ疄鐜板悓涓€涓�帴鍙�**銆�
 
-**实现某个接口的类型(除了实现接口方法外)可以有其他的方法**。
+**瀹炵幇鏌愪釜鎺ュ彛鐨勭被鍨嬶紙闄や簡瀹炵幇鎺ュ彛鏂规硶澶栵級鍙�互鏈夊叾浠栫殑鏂规硶**銆�
 
-**一个类型可以实现多个接口**。
+**涓€涓�被鍨嬪彲浠ュ疄鐜板�涓�帴鍙�**銆�
 
-**接口类型可以包含一个实例的引用, 该实例的类型实现了此接口(接口是动态类型)**。
+**鎺ュ彛绫诲瀷鍙�互鍖呭惈涓€涓�疄渚嬬殑寮曠敤锛� 璇ュ疄渚嬬殑绫诲瀷瀹炵幇浜嗘�鎺ュ彛锛堟帴鍙f槸鍔ㄦ€佺被鍨嬶級**銆�
 
-即使接口在类型之后才定义,二者处于不同的包中,被单独编译:只要类型实现了接口中的方法,它就实现了此接口。
+鍗充娇鎺ュ彛鍦ㄧ被鍨嬩箣鍚庢墠瀹氫箟锛屼簩鑰呭�浜庝笉鍚岀殑鍖呬腑锛岃�鍗曠嫭缂栬瘧锛氬彧瑕佺被鍨嬪疄鐜颁簡鎺ュ彛涓�殑鏂规硶锛屽畠灏卞疄鐜颁簡姝ゆ帴鍙c€�
 
-所有这些特性使得接口具有很大的灵活性。
+鎵€鏈夎繖浜涚壒鎬т娇寰楁帴鍙e叿鏈夊緢澶х殑鐏垫椿鎬с€�
 
-第一个例子:
+绗�竴涓�緥瀛愶細
 
-示例 11.1 interfaces.go:
+绀轰緥 11.1 interfaces.go锛�
 
 ```go
 package main
@@ -77,30 +77,30 @@ func main() {
 }
 ```
 
-输出:
+杈撳嚭锛�
 
     The square has area: 25.000000
 
-上面的程序定义了一个结构体 `Square` 和一个接口 `Shaper`,接口有一个方法 `Area()`。
+涓婇潰鐨勭▼搴忓畾涔変簡涓€涓�粨鏋勪綋 `Square` 鍜屼竴涓�帴鍙� `Shaper`锛屾帴鍙f湁涓€涓�柟娉� `Area()`銆�
 
-在 `main()` 方法中创建了一个 `Square` 的实例。在主程序外边定义了一个接收者类型是 `Square`方法的 `Area()`,用来计算正方形的面积:结构体 `Square` 实现了接口 `Shaper` 。
+鍦� `main()` 鏂规硶涓�垱寤轰簡涓€涓� `Square` 鐨勫疄渚嬨€傚湪涓荤▼搴忓�杈瑰畾涔変簡涓€涓�帴鏀惰€呯被鍨嬫槸 `Square`鏂规硶鐨� `Area()`锛岀敤鏉ヨ�绠楁�鏂瑰舰鐨勯潰绉�細缁撴瀯浣� `Square` 瀹炵幇浜嗘帴鍙� `Shaper` 銆�
 
-所以可以将一个 `Square` 类型的变量赋值给一个接口类型的变量:`areaIntf = sq1` 。
+鎵€浠ュ彲浠ュ皢涓€涓� `Square` 绫诲瀷鐨勫彉閲忚祴鍊肩粰涓€涓�帴鍙g被鍨嬬殑鍙橀噺锛歚areaIntf = sq1` 銆�
 
-现在接口变量包含一个指向 `Square` 变量的引用,通过它可以调用 `Square` 上的方法 `Area()`。当然也可以直接在 `Square` 的实例上调用此方法,但是在接口实例上调用此方法更令人兴奋,它使此方法更具有一般性。接口变量里包含了接收者实例的值和指向对应方法表的指针。
+鐜板湪鎺ュ彛鍙橀噺鍖呭惈涓€涓�寚鍚� `Square` 鍙橀噺鐨勫紩鐢�紝閫氳繃瀹冨彲浠ヨ皟鐢� `Square` 涓婄殑鏂规硶 `Area()`銆傚綋鐒朵篃鍙�互鐩存帴鍦� `Square` 鐨勫疄渚嬩笂璋冪敤姝ゆ柟娉曪紝浣嗘槸鍦ㄦ帴鍙e疄渚嬩笂璋冪敤姝ゆ柟娉曟洿浠や汉鍏村�锛屽畠浣挎�鏂规硶鏇村叿鏈変竴鑸�€с€傛帴鍙e彉閲忛噷鍖呭惈浜嗘帴鏀惰€呭疄渚嬬殑鍊煎拰鎸囧悜瀵瑰簲鏂规硶琛ㄧ殑鎸囬拡銆�
 
-这是 **多态** 的 Go 版本,多态是面向对象编程中一个广为人知的概念:根据当前的类型选择正确的方法,或者说:同一种类型在不同的实例上似乎表现出不同的行为。
+杩欐槸 **澶氭€�** 鐨� Go 鐗堟湰锛屽�鎬佹槸闈㈠悜瀵硅薄缂栫▼涓�竴涓�箍涓轰汉鐭ョ殑姒傚康锛氭牴鎹�綋鍓嶇殑绫诲瀷閫夋嫨姝g‘鐨勬柟娉曪紝鎴栬€呰�锛氬悓涓€绉嶇被鍨嬪湪涓嶅悓鐨勫疄渚嬩笂浼间箮琛ㄧ幇鍑轰笉鍚岀殑琛屼负銆�
 
-如果 `Square` 没有实现 `Area()` 方法,编译器将会给出清晰的错误信息:
+濡傛灉 `Square` 娌℃湁瀹炵幇 `Area()` 鏂规硶锛岀紪璇戝櫒灏嗕細缁欏嚭娓呮櫚鐨勯敊璇�俊鎭�細
 
     cannot use sq1 (type *Square) as type Shaper in assignment:
     *Square does not implement Shaper (missing Area method)
 
-如果 `Shaper` 有另外一个方法 `Perimeter()`,但是`Square` 没有实现它,即使没有人在 `Square` 实例上调用这个方法,编译器也会给出上面同样的错误。
+濡傛灉 `Shaper` 鏈夊彟澶栦竴涓�柟娉� `Perimeter()`锛屼絾鏄痐Square` 娌℃湁瀹炵幇瀹冿紝鍗充娇娌℃湁浜哄湪 `Square` 瀹炰緥涓婅皟鐢ㄨ繖涓�柟娉曪紝缂栬瘧鍣ㄤ篃浼氱粰鍑轰笂闈㈠悓鏍风殑閿欒�銆�
 
-扩展一下上面的例子,类型 `Rectangle` 也实现了 `Shaper` 接口。接着创建一个 `Shaper` 类型的数组,迭代它的每一个元素并在上面调用 `Area()` 方法,以此来展示多态行为:
+鎵╁睍涓€涓嬩笂闈㈢殑渚嬪瓙锛岀被鍨� `Rectangle` 涔熷疄鐜颁簡 `Shaper` 鎺ュ彛銆傛帴鐫€鍒涘缓涓€涓� `Shaper` 绫诲瀷鐨勬暟缁勶紝杩�唬瀹冪殑姣忎竴涓�厓绱犲苟鍦ㄤ笂闈㈣皟鐢� `Area()` 鏂规硶锛屼互姝ゆ潵灞曠ず澶氭€佽�涓猴細
 
-示例 11.2 interfaces_poly.go:
+绀轰緥 11.2 interfaces_poly.go锛�
 
 ```go
 package main
@@ -142,7 +142,7 @@ func main() {
 }
 ```
 
-输出:
+杈撳嚭锛�
 
     Looping through shapes for area ...
     Shape details:  {5 3}
@@ -150,13 +150,13 @@ func main() {
     Shape details:  &{5}
     Area of this shape is:  25
 
-在调用 `shapes[n].Area()) ` 这个时,只知道 `shapes[n]` 是一个 `Shaper` 对象,最后它摇身一变成为了一个 `Square` 或 `Rectangle` 对象,并且表现出了相对应的行为。
+鍦ㄨ皟鐢� `shapes[n].Area()) ` 杩欎釜鏃讹紝鍙�煡閬� `shapes[n]` 鏄�竴涓� `Shaper` 瀵硅薄锛屾渶鍚庡畠鎽囪韩涓€鍙樻垚涓轰簡涓€涓� `Square` 鎴� `Rectangle` 瀵硅薄锛屽苟涓旇〃鐜板嚭浜嗙浉瀵瑰簲鐨勮�涓恒€�
 
-也许从现在开始你将看到通过接口如何产生 **更干净**、**更简单** 及 **更具有扩展性** 的代码。在 11.12.3 中将看到在开发中为类型添加新的接口是多么的容易。
+涔熻�浠庣幇鍦ㄥ紑濮嬩綘灏嗙湅鍒伴€氳繃鎺ュ彛濡備綍浜х敓 **鏇村共鍑€**銆�**鏇寸畝鍗�** 鍙� **鏇村叿鏈夋墿灞曟€�** 鐨勪唬鐮併€傚湪 11.12.3 涓�皢鐪嬪埌鍦ㄥ紑鍙戜腑涓虹被鍨嬫坊鍔犳柊鐨勬帴鍙f槸澶氫箞鐨勫�鏄撱€�
 
-下面是一个更具体的例子:有两个类型 `stockPosition` 和 `car`,它们都有一个 `getValue()` 方法,我们可以定义一个具有此方法的接口 `valuable`。接着定义一个使用 `valuable`类型作为参数的函数 `showValue()`,所有实现了 `valuable` 接口的类型都可以用这个函数。
+涓嬮潰鏄�竴涓�洿鍏蜂綋鐨勪緥瀛愶細鏈変袱涓�被鍨� `stockPosition` 鍜� `car`锛屽畠浠�兘鏈変竴涓� `getValue()` 鏂规硶锛屾垜浠�彲浠ュ畾涔変竴涓�叿鏈夋�鏂规硶鐨勬帴鍙� `valuable`銆傛帴鐫€瀹氫箟涓€涓�娇鐢� `valuable`绫诲瀷浣滀负鍙傛暟鐨勫嚱鏁� `showValue()`锛屾墍鏈夊疄鐜颁簡 `valuable` 鎺ュ彛鐨勭被鍨嬮兘鍙�互鐢ㄨ繖涓�嚱鏁般€�
 
-示例 11.3 valuable.go:
+绀轰緥 11.3 valuable.go锛�
 
 ```go
 package main
@@ -202,14 +202,14 @@ func main() {
 }
 ```
 
-输出:
+杈撳嚭锛�
 
     Value of the asset is 2308.800049
     Value of the asset is 66500.000000
 
-**一个标准库的例子**
+**涓€涓�爣鍑嗗簱鐨勪緥瀛�**
 
-`io`包里有一个接口类型 `Reader`:
+`io`鍖呴噷鏈変竴涓�帴鍙g被鍨� `Reader`:
 
 ```go
 type Reader interface {
@@ -217,9 +217,9 @@ type Reader interface {
 }
 ```
 
-定义变量 `r`:` var r io.Reader`
+瀹氫箟鍙橀噺 `r`锛歚 var r io.Reader`
 
-那么就可以写如下的代码:
+閭d箞灏卞彲浠ュ啓濡備笅鐨勪唬鐮侊細
 
 ```go
 	var r io.Reader
@@ -230,27 +230,27 @@ type Reader interface {
 	r = bufio.NewReader(f)
 ```
 
-上面 `r` 右边的类型都实现了 `Read()` 方法,并且有相同的方法签名,`r` 的静态类型是 `io.Reader`。
+涓婇潰 `r` 鍙宠竟鐨勭被鍨嬮兘瀹炵幇浜� `Read()` 鏂规硶锛屽苟涓旀湁鐩稿悓鐨勬柟娉曠�鍚嶏紝`r` 鐨勯潤鎬佺被鍨嬫槸 `io.Reader`銆�
 
-**备注**
+**澶囨敞**
 
-有的时候,也会以一种稍微不同的方式来使用接口这个词:从某个类型的角度来看,它的接口指的是:它的所有导出方法,只不过没有显式地为这些导出方法额外定一个接口而已。
+鏈夌殑鏃跺€欙紝涔熶細浠ヤ竴绉嶇◢寰�笉鍚岀殑鏂瑰紡鏉ヤ娇鐢ㄦ帴鍙h繖涓�瘝锛氫粠鏌愪釜绫诲瀷鐨勮�搴︽潵鐪嬶紝瀹冪殑鎺ュ彛鎸囩殑鏄�細瀹冪殑鎵€鏈夊�鍑烘柟娉曪紝鍙�笉杩囨病鏈夋樉寮忓湴涓鸿繖浜涘�鍑烘柟娉曢�澶栧畾涓€涓�帴鍙h€屽凡銆�
 
-**练习 11.1** simple_interface.go:
+**缁冧範 11.1** simple_interface.go锛�
 
-定义一个接口 `Simpler`,它有一个 `Get()` 方法和一个 `Set()`,`Get()`返回一个整型值,`Set()` 有一个整型参数。创建一个结构体类型 `Simple` 实现这个接口。
+瀹氫箟涓€涓�帴鍙� `Simpler`锛屽畠鏈変竴涓� `Get()` 鏂规硶鍜屼竴涓� `Set()`锛宍Get()`杩斿洖涓€涓�暣鍨嬪€硷紝`Set()` 鏈変竴涓�暣鍨嬪弬鏁般€傚垱寤轰竴涓�粨鏋勪綋绫诲瀷 `Simple` 瀹炵幇杩欎釜鎺ュ彛銆�
 
-接着定一个函数,它有一个 `Simpler` 类型的参数,调用参数的 `Get()` 和 `Set()` 方法。在 `main` 函数里调用这个函数,看看它是否可以正确运行。
+鎺ョ潃瀹氫竴涓�嚱鏁帮紝瀹冩湁涓€涓� `Simpler` 绫诲瀷鐨勫弬鏁帮紝璋冪敤鍙傛暟鐨� `Get()` 鍜� `Set()` 鏂规硶銆傚湪 `main` 鍑芥暟閲岃皟鐢ㄨ繖涓�嚱鏁帮紝鐪嬬湅瀹冩槸鍚﹀彲浠ユ�纭�繍琛屻€�
 
-**练习 11.2** interfaces_poly2.go:
+**缁冧範 11.2** interfaces_poly2.go锛�
 
-a) 扩展 interfaces_poly.go 中的例子,添加一个 `Circle` 类型
+a) 鎵╁睍 interfaces_poly.go 涓�殑渚嬪瓙锛屾坊鍔犱竴涓� `Circle` 绫诲瀷
 
-b) 使用一个抽象类型 `Shape`(没有字段) 实现同样的功能,它实现接口 `Shaper`,然后在其他类型里内嵌此类型。扩展 10.6.5 中的例子来说明覆写。
+b) 浣跨敤涓€涓�娊璞$被鍨� `Shape`锛堟病鏈夊瓧娈碉級 瀹炵幇鍚屾牱鐨勫姛鑳斤紝瀹冨疄鐜版帴鍙� `Shaper`锛岀劧鍚庡湪鍏朵粬绫诲瀷閲屽唴宓屾�绫诲瀷銆傛墿灞� 10.6.5 涓�殑渚嬪瓙鏉ヨ�鏄庤�鍐欍€�
 
-## 链接
+## 閾炬帴
 
-- [目录](directory.md)
-- 上一节:[接口(Interfaces)与反射(reflection)](11.0.md)
-- 下一节:[接口嵌套接口](11.2.md)
+- [鐩�綍](directory.md)
+- 涓婁竴鑺傦細[鎺ュ彛锛圛nterfaces锛変笌鍙嶅皠锛坮eflection锛塢(11.0.md)
+- 涓嬩竴鑺傦細[鎺ュ彛宓屽�鎺ュ彛](11.2.md)
 

+ 7 - 7
eBook/11.2.md

@@ -1,8 +1,8 @@
-# 11.2 接口嵌套接口
+锘�# 11.2 鎺ュ彛宓屽�鎺ュ彛
 
-一个接口可以包含一个或多个其他的接口,这相当于直接将这些内嵌接口的方法列举在外层接口中一样。
+涓€涓�帴鍙e彲浠ュ寘鍚�竴涓�垨澶氫釜鍏朵粬鐨勬帴鍙o紝杩欑浉褰撲簬鐩存帴灏嗚繖浜涘唴宓屾帴鍙g殑鏂规硶鍒椾妇鍦ㄥ�灞傛帴鍙d腑涓€鏍枫€�
 
-比如接口 `File` 包含了 `ReadWrite` 和 `Lock` 的所有方法,它还额外有一个 `Close()` 方法。
+姣斿�鎺ュ彛 `File` 鍖呭惈浜� `ReadWrite` 鍜� `Lock` 鐨勬墍鏈夋柟娉曪紝瀹冭繕棰濆�鏈変竴涓� `Close()` 鏂规硶銆�
 
 ```go
 type ReadWrite interface {
@@ -22,8 +22,8 @@ type File interface {
 }
 ```
 
-## 链接
+## 閾炬帴
 
-- [目录](directory.md)
-- 上一节:[接口是什么](11.1.md)
-- 下一节:[如何检测和转换接口变量的类型:类型断言](11.3.md)
+- [鐩�綍](directory.md)
+- 涓婁竴鑺傦細[鎺ュ彛鏄�粈涔圿(11.1.md)
+- 涓嬩竴鑺傦細[濡備綍妫€娴嬪拰杞�崲鎺ュ彛鍙橀噺鐨勭被鍨嬶細绫诲瀷鏂�█](11.3.md)

+ 17 - 17
eBook/11.3.md

@@ -1,14 +1,14 @@
-# 11.3 类型断言:如何检测和转换接口变量的类型
+锘�# 11.3 绫诲瀷鏂�█锛氬�浣曟�娴嬪拰杞�崲鎺ュ彛鍙橀噺鐨勭被鍨�
 
-一个接口类型的变量 `varI` 中可以包含任何类型的值,必须有一种方式来检测它的 **动态** 类型,即运行时在变量中存储的值的实际类型。在执行过程中动态类型可能会有所不同,但是它总是可以分配给接口变量本身的类型。通常我们可以使用 **类型断言** 来测试在某个时刻 `varI` 是否包含类型 `T` 的值:
+涓€涓�帴鍙g被鍨嬬殑鍙橀噺 `varI` 涓�彲浠ュ寘鍚�换浣曠被鍨嬬殑鍊硷紝蹇呴』鏈変竴绉嶆柟寮忔潵妫€娴嬪畠鐨� **鍔ㄦ€�** 绫诲瀷锛屽嵆杩愯�鏃跺湪鍙橀噺涓�瓨鍌ㄧ殑鍊肩殑瀹為檯绫诲瀷銆傚湪鎵ц�杩囩▼涓�姩鎬佺被鍨嬪彲鑳戒細鏈夋墍涓嶅悓锛屼絾鏄�畠鎬绘槸鍙�互鍒嗛厤缁欐帴鍙e彉閲忔湰韬�殑绫诲瀷銆傞€氬父鎴戜滑鍙�互浣跨敤 **绫诲瀷鏂�█** 鏉ユ祴璇曞湪鏌愪釜鏃跺埢 `varI` 鏄�惁鍖呭惈绫诲瀷 `T` 鐨勫€硷細
 
 ```go
     v := varI.(T)       // unchecked type assertion
 ```
 
-**varI必须是一个接口变量**,否则编译器会报错:`invalid type assertion: varI.(T) (non-interface type (type of varI) on left)` 。
+**varI蹇呴』鏄�竴涓�帴鍙e彉閲�**锛屽惁鍒欑紪璇戝櫒浼氭姤閿欙細`invalid type assertion: varI.(T) (non-interface type (type of varI) on left)` 銆�
 
-类型断言可能是无效的,虽然编译器会尽力检查转换是否有效,但是它不可能预见所有的可能性。如果转换在程序运行时失败会导致错误发生。更安全的方式是使用以下形式来进行类型断言:
+绫诲瀷鏂�█鍙�兘鏄�棤鏁堢殑锛岃櫧鐒剁紪璇戝櫒浼氬敖鍔涙�鏌ヨ浆鎹㈡槸鍚︽湁鏁堬紝浣嗘槸瀹冧笉鍙�兘棰勮�鎵€鏈夌殑鍙�兘鎬с€傚�鏋滆浆鎹㈠湪绋嬪簭杩愯�鏃跺け璐ヤ細瀵艰嚧閿欒�鍙戠敓銆傛洿瀹夊叏鐨勬柟寮忔槸浣跨敤浠ヤ笅褰㈠紡鏉ヨ繘琛岀被鍨嬫柇瑷€锛�
 
 ```go
 if v, ok := varI.(T); ok {  // checked type assertion
@@ -18,11 +18,11 @@ if v, ok := varI.(T); ok {  // checked type assertion
 // varI is not of type T
 ```
 
-如果转换合法,`v` 是 `varI` 转换到类型 `T`的值,`ok` 会是 `true`;否则 `v` 是类型 `T` 的零值,`ok` 是 `false`,也没有运行时错误发生。
+濡傛灉杞�崲鍚堟硶锛宍v` 鏄� `varI` 杞�崲鍒扮被鍨� `T`鐨勫€硷紝`ok` 浼氭槸 `true`锛涘惁鍒� `v` 鏄�被鍨� `T` 鐨勯浂鍊硷紝`ok` 鏄� `false`锛屼篃娌℃湁杩愯�鏃堕敊璇�彂鐢熴€�
 
-**应该总是使用上面的方式来进行类型断言**。
+**搴旇�鎬绘槸浣跨敤涓婇潰鐨勬柟寮忔潵杩涜�绫诲瀷鏂�█**銆�
 
-多数情况下,我们可能只是想在 `if` 中测试一下 `ok` 的值,此时使用以下的方法会是最方便的:
+澶氭暟鎯呭喌涓嬶紝鎴戜滑鍙�兘鍙�槸鎯冲湪 `if` 涓�祴璇曚竴涓� `ok` 鐨勫€硷紝姝ゆ椂浣跨敤浠ヤ笅鐨勬柟娉曚細鏄�渶鏂逛究鐨勶細
 
 ```go
 if _, ok := varI.(T); ok {
@@ -30,9 +30,9 @@ if _, ok := varI.(T); ok {
 }
 ```
 
-TODO ??:In this form shadowing the variable varI by giving varI and v the same name is sometimes done.
+TODO ??锛欼n this form shadowing the variable varI by giving varI and v the same name is sometimes done.
 
-示例 11.4 type_interfaces.go
+绀轰緥 11.4 type_interfaces.go
 
 ```go
 package main
@@ -80,19 +80,19 @@ func (ci *Circle) Area() float32 {
 }
 ```
 
-输出:
+杈撳嚭锛�
 
     The type of areaIntf is: *main.Square
     areaIntf does not contain a variable of type Circle
 
-程序行中定义了一个新类型 `Circle`,它也实现了 `Shaper` 接口。 `t, ok := areaIntf.(*Square); ok ` 测试 `areaIntf` 里是否一个包含 'Square' 类型的变量,结果是确定的;然后我们测试它是否包含一个 'Circle' 类型的变量,结果是否定的。
+绋嬪簭琛屼腑瀹氫箟浜嗕竴涓�柊绫诲瀷 `Circle`锛屽畠涔熷疄鐜颁簡 `Shaper` 鎺ュ彛銆� `t, ok := areaIntf.(*Square); ok ` 娴嬭瘯 `areaIntf` 閲屾槸鍚︿竴涓�寘鍚� 'Square' 绫诲瀷鐨勫彉閲忥紝缁撴灉鏄�‘瀹氱殑锛涚劧鍚庢垜浠�祴璇曞畠鏄�惁鍖呭惈涓€涓� 'Circle' 绫诲瀷鐨勫彉閲忥紝缁撴灉鏄�惁瀹氱殑銆�
 
-**备注**
+**澶囨敞**
 
-如果忽略 `areaIntf.(*Square)` 中的 `*` 号,会导致编译错误:`impossible type assertion: Square does not implement Shaper (Area method has pointer receiver)`。
+濡傛灉蹇界暐 `areaIntf.(*Square)` 涓�殑 `*` 鍙凤紝浼氬�鑷寸紪璇戦敊璇�細`impossible type assertion: Square does not implement Shaper (Area method has pointer receiver)`銆�
 
-## 链接
+## 閾炬帴
 
-- [目录](directory.md)
-- 上一节:[接口嵌套接口](11.2.md)
-- 下一节:[类型判断:type-switch](11.4.md)
+- [鐩�綍](directory.md)
+- 涓婁竴鑺傦細[鎺ュ彛宓屽�鎺ュ彛](11.2.md)
+- 涓嬩竴鑺傦細[绫诲瀷鍒ゆ柇锛歵ype-switch](11.4.md)

+ 16 - 16
eBook/11.4.md

@@ -1,6 +1,6 @@
-# 11.4 类型判断:type-switch
+锘�# 11.4 绫诲瀷鍒ゆ柇锛歵ype-switch
 
-接口变量的类型也可以使用一种特殊形式的 `swtich` 来检测:**type-swtich** (下面是 示例 11.4 的第二部分):
+鎺ュ彛鍙橀噺鐨勭被鍨嬩篃鍙�互浣跨敤涓€绉嶇壒娈婂舰寮忕殑 `swtich` 鏉ユ�娴嬶細**type-swtich** 锛堜笅闈㈡槸 绀轰緥 11.4 鐨勭�浜岄儴鍒嗭級锛�
 
 ```go
 	switch t := areaIntf.(type) {
@@ -15,15 +15,15 @@
 	}
 ```
 
-输出:
+杈撳嚭锛�
 
     Type Square *main.Square with value &{5}
 
-变量 `t` 得到了 `areaIntf` 的值和类型, 所有 `case` 语句中列举的类型(`nil` 除外)都必须实现对应的接口(在上例中即 `Shaper`),如果被检测类型没有在 `case` 语句列举的类型中,就会执行`default` 语句。
+鍙橀噺 `t` 寰楀埌浜� `areaIntf` 鐨勫€煎拰绫诲瀷锛� 鎵€鏈� `case` 璇�彞涓�垪涓剧殑绫诲瀷锛坄nil` 闄ゅ�锛夐兘蹇呴』瀹炵幇瀵瑰簲鐨勬帴鍙o紙鍦ㄤ笂渚嬩腑鍗� `Shaper`锛夛紝濡傛灉琚��娴嬬被鍨嬫病鏈夊湪 `case` 璇�彞鍒椾妇鐨勭被鍨嬩腑锛屽氨浼氭墽琛宍default` 璇�彞銆�
 
-可以用 `type-switch` 进行运行时类型分析,但是在 `type-switch` 不允许有 `fallthrough` 。
+鍙�互鐢� `type-switch` 杩涜�杩愯�鏃剁被鍨嬪垎鏋愶紝浣嗘槸鍦� `type-switch` 涓嶅厑璁告湁 `fallthrough` 銆�
 
-如果仅仅是测试变量的类型,不用它的值,那么就可以不需要赋值语句,比如:
+濡傛灉浠呬粎鏄�祴璇曞彉閲忕殑绫诲瀷锛屼笉鐢ㄥ畠鐨勫€硷紝閭d箞灏卞彲浠ヤ笉闇€瑕佽祴鍊艰�鍙ワ紝姣斿�锛�
 
 ```go
 	switch areaIntf.(type) {
@@ -37,7 +37,7 @@
 	}
 ```
 
-下面的代码片段展示了一个类型分类函数,它有一个可变长度参数,可以是任意类型的数组,它会根据数组元素的实际类型执行不同的动作:
+涓嬮潰鐨勪唬鐮佺墖娈靛睍绀轰簡涓€涓�被鍨嬪垎绫诲嚱鏁帮紝瀹冩湁涓€涓�彲鍙橀暱搴﹀弬鏁帮紝鍙�互鏄�换鎰忕被鍨嬬殑鏁扮粍锛屽畠浼氭牴鎹�暟缁勫厓绱犵殑瀹為檯绫诲瀷鎵ц�涓嶅悓鐨勫姩浣滐細
 
 ```go
 
@@ -61,18 +61,18 @@ func classifier(items ...interface{}) {
 }
 ```
 
-可以这样调用此方法:`classifier(13, -14.3, "BELGIUM", complex(1, 2), nil, false)` 。
+鍙�互杩欐牱璋冪敤姝ゆ柟娉曪細`classifier(13, -14.3, "BELGIUM", complex(1, 2), nil, false)` 銆�
 
-在处理来自于外部的、类型未知的数据时,比如解析诸如 JSON 或 XML 编码的数据,类型测试和转换会非常有用。
+鍦ㄥ�鐞嗘潵鑷�簬澶栭儴鐨勩€佺被鍨嬫湭鐭ョ殑鏁版嵁鏃讹紝姣斿�瑙f瀽璇稿� JSON 鎴� XML 缂栫爜鐨勬暟鎹�紝绫诲瀷娴嬭瘯鍜岃浆鎹�細闈炲父鏈夌敤銆�
 
-在 示例12.17(xml.go) 中解析 XML 文档是,我们就会用到 `type-switch` 。
+鍦� 绀轰緥12.17(xml.go) 涓�В鏋� XML 鏂囨。鏄�紝鎴戜滑灏变細鐢ㄥ埌 `type-switch` 銆�
 
-**练习 11.4** simple_interface2.go:
+**缁冧範 11.4** simple_interface2.go锛�
 
-接着 练习11.1 中的内容,创建第二个类型 `RSimple`,它也实现了接口 `Simpler`,写一个函数 `fi`,它可以区分 `Simple` 和 `RSimple` 类型的变量。
+鎺ョ潃 缁冧範11.1 涓�殑鍐呭�锛屽垱寤虹�浜屼釜绫诲瀷 `RSimple`锛屽畠涔熷疄鐜颁簡鎺ュ彛 `Simpler`锛屽啓涓€涓�嚱鏁� `fi`锛屽畠鍙�互鍖哄垎 `Simple` 鍜� `RSimple` 绫诲瀷鐨勫彉閲忋€�
 
-## 链接
+## 閾炬帴
 
-- [目录](directory.md)
-- 上一节:[类型断言:如何检测和转换接口变量的类型](11.3.md)
-- 下一节:[测试一个值是否实现了某个接口](11.5.md)
+- [鐩�綍](directory.md)
+- 涓婁竴鑺傦細[绫诲瀷鏂�█锛氬�浣曟�娴嬪拰杞�崲鎺ュ彛鍙橀噺鐨勭被鍨媇(11.3.md)
+- 涓嬩竴鑺傦細[娴嬭瘯涓€涓�€兼槸鍚﹀疄鐜颁簡鏌愪釜鎺ュ彛](11.5.md)

+ 12 - 12
eBook/11.5.md

@@ -1,6 +1,6 @@
-# 11.5 测试一个值是否实现了某个接口
+锘�# 11.5 娴嬭瘯涓€涓�€兼槸鍚﹀疄鐜颁簡鏌愪釜鎺ュ彛
 
-这是 11.3 类型断言中的一个特例:假定 `v` 是一个值,然后我们想测试它是否实现了 `Stringer` 接口,可以这样做:
+杩欐槸 11.3 绫诲瀷鏂�█涓�殑涓€涓�壒渚嬶細鍋囧畾 `v` 鏄�竴涓�€硷紝鐒跺悗鎴戜滑鎯虫祴璇曞畠鏄�惁瀹炵幇浜� `Stringer` 鎺ュ彛锛屽彲浠ヨ繖鏍峰仛锛�
 
 ```go
 type Stringer interface {
@@ -12,20 +12,20 @@ if sv, ok := v.(Stringer); ok {
 }
 ```
 
-`Print` 函数就是如此检测类型是否可以打印自身的。
+`Print` 鍑芥暟灏辨槸濡傛�妫€娴嬬被鍨嬫槸鍚﹀彲浠ユ墦鍗拌嚜韬�殑銆�
 
-接口是一种契约,实现类型必须满足它,它描述了类型的行为,规定类型可以做什么。接口彻底将类型能做什么,以及如何做分离开来,使得相同接口的变量在不同的时刻表现出不同的行为,这就是多态的本质。
+鎺ュ彛鏄�竴绉嶅�绾︼紝瀹炵幇绫诲瀷蹇呴』婊¤冻瀹冿紝瀹冩弿杩颁簡绫诲瀷鐨勮�涓猴紝瑙勫畾绫诲瀷鍙�互鍋氫粈涔堛€傛帴鍙e交搴曞皢绫诲瀷鑳藉仛浠€涔堬紝浠ュ強濡備綍鍋氬垎绂诲紑鏉ワ紝浣垮緱鐩稿悓鎺ュ彛鐨勫彉閲忓湪涓嶅悓鐨勬椂鍒昏〃鐜板嚭涓嶅悓鐨勮�涓猴紝杩欏氨鏄��鎬佺殑鏈�川銆�
 
-编写参数是接口变量的函数,这使得它们更具有一般性。
+缂栧啓鍙傛暟鏄�帴鍙e彉閲忕殑鍑芥暟锛岃繖浣垮緱瀹冧滑鏇村叿鏈変竴鑸�€с€�
 
-**使用接口使代码更具有普适性。**
+**浣跨敤鎺ュ彛浣夸唬鐮佹洿鍏锋湁鏅�€傛€с€�**
 
-标准库里到处都使用了这个原则,如果对接口概念没有良好的把握,是不可能理解它是如何构建的。
+鏍囧噯搴撻噷鍒板�閮戒娇鐢ㄤ簡杩欎釜鍘熷垯锛屽�鏋滃�鎺ュ彛姒傚康娌℃湁鑹�ソ鐨勬妸鎻★紝鏄�笉鍙�兘鐞嗚В瀹冩槸濡備綍鏋勫缓鐨勩€�
 
-在接下来的章节中,我们会讨论两个重要的例子,试着去深入理解它们,这样你就可以更好的应用上面的原则。
+鍦ㄦ帴涓嬫潵鐨勭珷鑺備腑锛屾垜浠�細璁ㄨ�涓や釜閲嶈�鐨勪緥瀛愶紝璇曠潃鍘绘繁鍏ョ悊瑙e畠浠�紝杩欐牱浣犲氨鍙�互鏇村ソ鐨勫簲鐢ㄤ笂闈㈢殑鍘熷垯銆�
 
-## 链接
+## 閾炬帴
 
-- [目录](directory.md)
-- 上一节:[类型判断:type-switch](11.4.md)
-- 下一节:[使用方法集与接口](11.6.md)
+- [鐩�綍](directory.md)
+- 涓婁竴鑺傦細[绫诲瀷鍒ゆ柇锛歵ype-switch](11.4.md)
+- 涓嬩竴鑺傦細[浣跨敤鏂规硶闆嗕笌鎺ュ彛](11.6.md)

+ 22 - 22
eBook/11.6.md

@@ -1,8 +1,8 @@
-# 11.6 使用方法集与接口
+锘�# 11.6 浣跨敤鏂规硶闆嗕笌鎺ュ彛
 
-在 10.6.3 及例子 methodset1.go 中我们看到,作用于变量上的方法实际上是不区分变量到底是指针还是值的。当碰到接口类型值时,这会变得有点复杂,原因是接口变量中存储的具体值是不可寻址的,幸运的是,如果使用不当编译器会给出错误。考虑下面的程序:
+鍦� 10.6.3 鍙婁緥瀛� methodset1.go 涓�垜浠�湅鍒帮紝浣滅敤浜庡彉閲忎笂鐨勬柟娉曞疄闄呬笂鏄�笉鍖哄垎鍙橀噺鍒板簳鏄�寚閽堣繕鏄�€肩殑銆傚綋纰板埌鎺ュ彛绫诲瀷鍊兼椂锛岃繖浼氬彉寰楁湁鐐瑰�鏉傦紝鍘熷洜鏄�帴鍙e彉閲忎腑瀛樺偍鐨勫叿浣撳€兼槸涓嶅彲瀵诲潃鐨勶紝骞歌繍鐨勬槸锛屽�鏋滀娇鐢ㄤ笉褰撶紪璇戝櫒浼氱粰鍑洪敊璇�€傝€冭檻涓嬮潰鐨勭▼搴忥細
 
-示例 11.5 methodset2.go:
+绀轰緥 11.5 methodset2.go:
 
 ```go
 package main
@@ -60,34 +60,34 @@ func main() {
 }
 ```
 
-**讨论**
+**璁ㄨ�**
 
-在 `lst` 上调用 `CountInto` 时会导致一个编译器错误,因为 `CountInto` 需要一个 `Appender`,而它的方法 `Append` 只定义在指针上。 在 `lst` 上调用 `LongEnough` 是可以的因为 'Len' 定义在值上。
+鍦� `lst` 涓婅皟鐢� `CountInto` 鏃朵細瀵艰嚧涓€涓�紪璇戝櫒閿欒�锛屽洜涓� `CountInto` 闇€瑕佷竴涓� `Appender`锛岃€屽畠鐨勬柟娉� `Append` 鍙�畾涔夊湪鎸囬拡涓娿€� 鍦� `lst` 涓婅皟鐢� `LongEnough` 鏄�彲浠ョ殑鍥犱负 'Len' 瀹氫箟鍦ㄥ€间笂銆�
 
-在 `plst` 上调用 `CountInto` 是可以的,因为 `CountInto` 需要一个 `Appender`,并且它的方法 `Append` 定义在指针上。 在 `plst` 上调用 `LongEnough` 也是可以的,因为指针会被自动解引用。
+鍦� `plst` 涓婅皟鐢� `CountInto` 鏄�彲浠ョ殑锛屽洜涓� `CountInto` 闇€瑕佷竴涓� `Appender`锛屽苟涓斿畠鐨勬柟娉� `Append` 瀹氫箟鍦ㄦ寚閽堜笂銆� 鍦� `plst` 涓婅皟鐢� `LongEnough` 涔熸槸鍙�互鐨勶紝鍥犱负鎸囬拡浼氳�鑷�姩瑙e紩鐢ㄣ€�
 
-**总结**
+**鎬荤粨**
 
-在接口上调用方法时,必须有和方法定义时相同的接收者类型或者是可以从具体类型 `P` 直接可以辨识的:
+鍦ㄦ帴鍙d笂璋冪敤鏂规硶鏃讹紝蹇呴』鏈夊拰鏂规硶瀹氫箟鏃剁浉鍚岀殑鎺ユ敹鑰呯被鍨嬫垨鑰呮槸鍙�互浠庡叿浣撶被鍨� `P` 鐩存帴鍙�互杈ㄨ瘑鐨勶細
 
-- 指针方法可以通过指针调用
-- 值方法可以通过值调用
-- 接收者是值的方法可以通过指针调用,因为指针会首先被解引用
-- 接收者是指针的方法不可以通过值调用,因为存储在接口中的值没有地址
+- 鎸囬拡鏂规硶鍙�互閫氳繃鎸囬拡璋冪敤
+- 鍊兼柟娉曞彲浠ラ€氳繃鍊艰皟鐢�
+- 鎺ユ敹鑰呮槸鍊肩殑鏂规硶鍙�互閫氳繃鎸囬拡璋冪敤锛屽洜涓烘寚閽堜細棣栧厛琚�В寮曠敤
+- 鎺ユ敹鑰呮槸鎸囬拡鐨勬柟娉曚笉鍙�互閫氳繃鍊艰皟鐢�紝鍥犱负瀛樺偍鍦ㄦ帴鍙d腑鐨勫€兼病鏈夊湴鍧€
 
-将一个值赋值给一个接口赋值时,编译器会确保所有可能的接口方法都可以在此值上被调用,因此不正确的赋值在编译期就会失败。
+灏嗕竴涓�€艰祴鍊肩粰涓€涓�帴鍙h祴鍊兼椂锛岀紪璇戝櫒浼氱‘淇濇墍鏈夊彲鑳界殑鎺ュ彛鏂规硶閮藉彲浠ュ湪姝ゅ€间笂琚�皟鐢�紝鍥犳�涓嶆�纭�殑璧嬪€煎湪缂栬瘧鏈熷氨浼氬け璐ャ€�
 
 
-**译注**
+**璇戞敞**
 
-Go语言规范定义了接口方法集的调用规则:
+Go璇�█瑙勮寖瀹氫箟浜嗘帴鍙f柟娉曢泦鐨勮皟鐢ㄨ�鍒欙細
 
-- 类型 *T 的可调用方法集包含接受者为 *T 或 T 的所有方法集
-- 类型 T 的可调用方法集包含接受者为 T 的所有方法
-- 类型 T 的可调用方法集不包含接受者为 *T 的方法
+- 绫诲瀷 *T 鐨勫彲璋冪敤鏂规硶闆嗗寘鍚�帴鍙楄€呬负 *T 鎴� T 鐨勬墍鏈夋柟娉曢泦
+- 绫诲瀷 T 鐨勫彲璋冪敤鏂规硶闆嗗寘鍚�帴鍙楄€呬负 T 鐨勬墍鏈夋柟娉�
+- 绫诲瀷 T 鐨勫彲璋冪敤鏂规硶闆嗕笉鍖呭惈鎺ュ彈鑰呬负 *T 鐨勬柟娉�
 
-## 链接
+## 閾炬帴
 
-- [目录](directory.md)
-- 上一节:[测试一个值是否实现了某个接口](11.5.md)
-- 下一节:[第一个例子:使用Sorter接口排序](11.7.md)
+- [鐩�綍](directory.md)
+- 涓婁竴鑺傦細[娴嬭瘯涓€涓�€兼槸鍚﹀疄鐜颁簡鏌愪釜鎺ュ彛](11.5.md)
+- 涓嬩竴鑺傦細[绗�竴涓�緥瀛愶細浣跨敤Sorter鎺ュ彛鎺掑簭](11.7.md)

+ 34 - 34
eBook/11.7.md

@@ -1,9 +1,9 @@
-# 11.7 第一个例子:使用Sorter接口排序
+锘�# 11.7 绗�竴涓�緥瀛愶細浣跨敤Sorter鎺ュ彛鎺掑簭
 
-一个很好的例子是来自标准库的 `sort` 包,要对一组数字或字符串排序,只需要实现三个方法:反映元素个数的 `Len()`方法、比较第 `i` 和 `j` 个元素的 `Less(i, j)` 方法以及交换第 `i` 和 `j` 个元素的 `Swap(i, j)` 方法。
+涓€涓�緢濂界殑渚嬪瓙鏄�潵鑷�爣鍑嗗簱鐨� `sort` 鍖咃紝瑕佸�涓€缁勬暟瀛楁垨瀛楃�涓叉帓搴忥紝鍙�渶瑕佸疄鐜颁笁涓�柟娉曪細鍙嶆槧鍏冪礌涓�暟鐨� `Len()`鏂规硶銆佹瘮杈冪� `i` 鍜� `j` 涓�厓绱犵殑 `Less(i, j)` 鏂规硶浠ュ強浜ゆ崲绗� `i` 鍜� `j` 涓�厓绱犵殑 `Swap(i, j)` 鏂规硶銆�
 
 
-排序函数的算法只会使用到这三个方法(可以使用任何排序算法来实现,此处我们使用冒泡排序):
+鎺掑簭鍑芥暟鐨勭畻娉曞彧浼氫娇鐢ㄥ埌杩欎笁涓�柟娉曪紙鍙�互浣跨敤浠讳綍鎺掑簭绠楁硶鏉ュ疄鐜帮紝姝ゅ�鎴戜滑浣跨敤鍐掓场鎺掑簭锛夛細
 
 ```go
 func Sort(data Sorter) {
@@ -17,7 +17,7 @@ func Sort(data Sorter) {
 }
 ```
 
-`Sort` 函数接收一个接口类型参数: `Sorter` ,它声明了这些方法:
+`Sort` 鍑芥暟鎺ユ敹涓€涓�帴鍙g被鍨嬪弬鏁帮細 `Sorter` 锛屽畠澹版槑浜嗚繖浜涙柟娉曪細
 
 ```go
 type Sorter interface {
@@ -27,9 +27,9 @@ type Sorter interface {
 }
 ```
 
-参数中的 `int` 不是说要排序的对象一定要是一组 `int`,`i` 和 `j` 表示元素的整型索引,长度也是整型的。
+鍙傛暟涓�殑 `int` 涓嶆槸璇磋�鎺掑簭鐨勫�璞′竴瀹氳�鏄�竴缁� `int`锛宍i` 鍜� `j` 琛ㄧず鍏冪礌鐨勬暣鍨嬬储寮曪紝闀垮害涔熸槸鏁村瀷鐨勩€�
 
-现在如果我们想对一个 `int` 数组进行排序,所有必须做的事情就是:为数组定一个类型并在它上面实现 `Sorter` 接口的方法:
+鐜板湪濡傛灉鎴戜滑鎯冲�涓€涓� `int` 鏁扮粍杩涜�鎺掑簭锛屾墍鏈夊繀椤诲仛鐨勪簨鎯呭氨鏄�細涓烘暟缁勫畾涓€涓�被鍨嬪苟鍦ㄥ畠涓婇潰瀹炵幇 `Sorter` 鎺ュ彛鐨勬柟娉曪細
 
 ```go
 type IntArray []int
@@ -38,7 +38,7 @@ func (p IntArray) Less(i, j int) bool { return p[i] < p[j] }
 func (p IntArray) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
 ```
 
-下面是调用排序函数的一个具体例子:
+涓嬮潰鏄�皟鐢ㄦ帓搴忓嚱鏁扮殑涓€涓�叿浣撲緥瀛愶細
 
 ```go
 data := []int{74, 59, 238, -784, 9845, 959, 905, 0, 0, 42, 7586, -5467984, 7586}
@@ -46,11 +46,11 @@ a := sort.IntArray(data) //conversion to type IntArray from package sort
 sort.Sort(a)
 ```
 
-完整的、可运行的代码可以在 `sort.go` 和 `sortmain.go` 里找到。
+瀹屾暣鐨勩€佸彲杩愯�鐨勪唬鐮佸彲浠ュ湪 `sort.go` 鍜� `sortmain.go` 閲屾壘鍒般€�
 
-同样的原理,排序函数可以用于一个浮点型数组,一个字符串数组,或者一个表示每周各天的结构体 `dayArray`.
+鍚屾牱鐨勫師鐞嗭紝鎺掑簭鍑芥暟鍙�互鐢ㄤ簬涓€涓�诞鐐瑰瀷鏁扮粍锛屼竴涓�瓧绗︿覆鏁扮粍锛屾垨鑰呬竴涓�〃绀烘瘡鍛ㄥ悇澶╃殑缁撴瀯浣� `dayArray`.
 
-示例 11.6 sort.go:
+绀轰緥 11.6 sort.go锛�
 
 ```go
 package sort
@@ -102,7 +102,7 @@ func IntsAreSorted(a []int) bool       { return IsSorted(IntArray(a)) }
 func StringsAreSorted(a []string) bool { return IsSorted(StringArray(a)) }
 ```
 
-示例 11.7 sortmain.go:
+绀轰緥 11.7 sortmain.go锛�
 
 ```go
 package main
@@ -173,17 +173,17 @@ func main() {
 }
 ```
 
-输出:
+杈撳嚭锛�
 
     The sorted array is: [-5467984 -784 0 0 42 59 74 238 905 959 7586 7586 9845]
     The sorted array is: [ friday monday saturday sunday thursday tuesday wednesday]
     Sunday Monday Tuesday Wednesday Thursday Friday Saturday 
 
-**备注**:
+**澶囨敞**锛�
 
-`panic("fail")` 用于停止处于在非正常情况下的程序(详细请参考 第13章),当然也可以先打印一条信息,然后调用 `os.Exit(1)` 来停止程序。
+`panic("fail")` 鐢ㄤ簬鍋滄�澶勪簬鍦ㄩ潪姝e父鎯呭喌涓嬬殑绋嬪簭锛堣�缁嗚�鍙傝€� 绗�13绔狅級锛屽綋鐒朵篃鍙�互鍏堟墦鍗颁竴鏉′俊鎭�紝鐒跺悗璋冪敤 `os.Exit(1)` 鏉ュ仠姝㈢▼搴忋€�
 
-上面的例子帮助我们进一步了解了接口的意义和使用方式。对于基本类型的排序,标准库已经提供了相关的排序函数,所以不需要我们再重复造轮子了。对于一般性的排序,`sort` 包定义了一个接口:
+涓婇潰鐨勪緥瀛愬府鍔╂垜浠�繘涓€姝ヤ簡瑙d簡鎺ュ彛鐨勬剰涔夊拰浣跨敤鏂瑰紡銆傚�浜庡熀鏈�被鍨嬬殑鎺掑簭锛屾爣鍑嗗簱宸茬粡鎻愪緵浜嗙浉鍏崇殑鎺掑簭鍑芥暟锛屾墍浠ヤ笉闇€瑕佹垜浠�啀閲嶅�閫犺疆瀛愪簡銆傚�浜庝竴鑸�€х殑鎺掑簭锛宍sort` 鍖呭畾涔変簡涓€涓�帴鍙o細
 
 ```go
 type Interface interface {
@@ -193,36 +193,36 @@ type Interface interface {
 }
 ```
 
-这个接口总结了需要用于排序的抽象方法,函数 `Sort(data Interface)` 用来对此类对象进行排序,可以用它们来实现对其他数据(非基本类型)进行排序。在上面的例子中,我们也是这么做的,不仅可以对 `int` 和 `string` 序列进行排序,也可以对用户自定义类型 `dayArray` 进行排序。
+杩欎釜鎺ュ彛鎬荤粨浜嗛渶瑕佺敤浜庢帓搴忕殑鎶借薄鏂规硶锛屽嚱鏁� `Sort(data Interface)` 鐢ㄦ潵瀵规�绫诲�璞¤繘琛屾帓搴忥紝鍙�互鐢ㄥ畠浠�潵瀹炵幇瀵瑰叾浠栨暟鎹�紙闈炲熀鏈�被鍨嬶級杩涜�鎺掑簭銆傚湪涓婇潰鐨勪緥瀛愪腑锛屾垜浠�篃鏄�繖涔堝仛鐨勶紝涓嶄粎鍙�互瀵� `int` 鍜� `string` 搴忓垪杩涜�鎺掑簭锛屼篃鍙�互瀵圭敤鎴疯嚜瀹氫箟绫诲瀷 `dayArray` 杩涜�鎺掑簭銆�
 
-**练习 11.5** interfaces_ext.go:
+**缁冧範 11.5** interfaces_ext.go锛�
 
-a). 继续扩展程序,定义类型 `Triangle`,让它实现 `AreaInterface` 接口。通过计算一个特定三角形的面积来进行测试(三角形面积=0.5 * (底 * 高))
+a). 缁х画鎵╁睍绋嬪簭锛屽畾涔夌被鍨� `Triangle`锛岃�瀹冨疄鐜� `AreaInterface` 鎺ュ彛銆傞€氳繃璁$畻涓€涓�壒瀹氫笁瑙掑舰鐨勯潰绉�潵杩涜�娴嬭瘯锛堜笁瑙掑舰闈㈢Н=0.5 * (搴� * 楂�)锛�
 
-b). 定义一个新接口 `PeriInterface`,它有一个 `Perimeter` 接口。让 `Square` 实现这个接口,并通过一个 `Square` 示例来测试它。
+b). 瀹氫箟涓€涓�柊鎺ュ彛 `PeriInterface`锛屽畠鏈変竴涓� `Perimeter` 鎺ュ彛銆傝� `Square` 瀹炵幇杩欎釜鎺ュ彛锛屽苟閫氳繃涓€涓� `Square` 绀轰緥鏉ユ祴璇曞畠銆�
 
-**练习 11.6** point_interfaces.go:
+**缁冧範 11.6** point_interfaces.go锛�
 
-继续 10.3 中的练习 point_methods.go,定义接口 `Magnitude`,它有一个方法 `Abs()`。让 `Point`、`Point3` 及`Polar` 实现此接口。通过接口类型变量使用方法做point.go中同样的事情。
+缁х画 10.3 涓�殑缁冧範 point_methods.go锛屽畾涔夋帴鍙� `Magnitude`锛屽畠鏈変竴涓�柟娉� `Abs()`銆傝� `Point`銆乣Point3` 鍙奰Polar` 瀹炵幇姝ゆ帴鍙c€傞€氳繃鎺ュ彛绫诲瀷鍙橀噺浣跨敤鏂规硶鍋歱oint.go涓�悓鏍风殑浜嬫儏銆�
 
-**练习 11.7** float_sort.go / float_sortmain.go:
+**缁冧範 11.7** float_sort.go / float_sortmain.go锛�
 
-类似11.7和示例11.3/4,定义一个包 `float64`,并在包里定义类型 `Float64Array`,然后让它实现 `Sorter` 接口用来对 `float64` 数组进行排序。
+绫讳技11.7鍜岀ず渚�11.3/4锛屽畾涔変竴涓�寘 `float64`锛屽苟鍦ㄥ寘閲屽畾涔夌被鍨� `Float64Array`锛岀劧鍚庤�瀹冨疄鐜� `Sorter` 鎺ュ彛鐢ㄦ潵瀵� `float64` 鏁扮粍杩涜�鎺掑簭銆�
 
-另外提供如下方法:
+鍙﹀�鎻愪緵濡備笅鏂规硶锛�
 
-- `NewFloat64Array()`:创建一个包含25个元素的数组变量(参考10.2)
-- `List()`:返回数组格式化后的字符串,并在 `String()` 方法中调用它,这样就不用显式地调用 `List()` 来打印数组(参考10.7)
-- `Fill()`:创建一个包含10个随机浮点数的数组(参考4.5.2.6)
+- `NewFloat64Array()`锛氬垱寤轰竴涓�寘鍚�25涓�厓绱犵殑鏁扮粍鍙橀噺锛堝弬鑰�10.2锛�
+- `List()`锛氳繑鍥炴暟缁勬牸寮忓寲鍚庣殑瀛楃�涓诧紝骞跺湪 `String()` 鏂规硶涓�皟鐢ㄥ畠锛岃繖鏍峰氨涓嶇敤鏄惧紡鍦拌皟鐢� `List()` 鏉ユ墦鍗版暟缁勶紙鍙傝€�10.7锛�
+- `Fill()`锛氬垱寤轰竴涓�寘鍚�10涓�殢鏈烘诞鐐规暟鐨勬暟缁勶紙鍙傝€�4.5.2.6锛�
 
-在主程序中新建一个此类型的变量,然后对它排序并进行测试。
+鍦ㄤ富绋嬪簭涓�柊寤轰竴涓��绫诲瀷鐨勫彉閲忥紝鐒跺悗瀵瑰畠鎺掑簭骞惰繘琛屾祴璇曘€�
 
-**练习 11.8** sort.go/sort_persons.go:
+**缁冧範 11.8** sort.go/sort_persons.go锛�
 
-定义一个结构体 `Person`,它有两个字段:`firstName` 和 `lastName`,为 `[]Person` 定义类型 `Persons` 。让 `Persons` 实现 `Sorter` 接口并进行测试。
+瀹氫箟涓€涓�粨鏋勪綋 `Person`锛屽畠鏈変袱涓�瓧娈碉細`firstName` 鍜� `lastName`锛屼负 `[]Person` 瀹氫箟绫诲瀷 `Persons` 銆傝� `Persons` 瀹炵幇 `Sorter` 鎺ュ彛骞惰繘琛屾祴璇曘€�
 
-## 链接
+## 閾炬帴
 
-- [目录](directory.md)
-- 上一节:[使用方法集与接口](11.6.md)
-- 下一节:[第二个例子:读和写](11.8.md)
+- [鐩�綍](directory.md)
+- 涓婁竴鑺傦細[浣跨敤鏂规硶闆嗕笌鎺ュ彛](11.6.md)
+- 涓嬩竴鑺傦細[绗�簩涓�緥瀛愶細璇诲拰鍐橾(11.8.md)

+ 11 - 11
eBook/11.8.md

@@ -1,8 +1,8 @@
-# 11.8 第二个例子:读和写
+锘�# 11.8 绗�簩涓�緥瀛愶細璇诲拰鍐�
 
-读和写是软件中很普遍的行为,提起它们会立即想到读写文件、缓存(比如字节或字符串切片)、标准输入输出、标准错误以及网络连接、管道等等,或者读写我们的自定义类型。为了是代码尽可能通用,Go 采取了一致的方式来读写数据。
+璇诲拰鍐欐槸杞�欢涓�緢鏅�亶鐨勮�涓猴紝鎻愯捣瀹冧滑浼氱珛鍗虫兂鍒拌�鍐欐枃浠躲€佺紦瀛橈紙姣斿�瀛楄妭鎴栧瓧绗︿覆鍒囩墖锛夈€佹爣鍑嗚緭鍏ヨ緭鍑恒€佹爣鍑嗛敊璇�互鍙婄綉缁滆繛鎺ャ€佺�閬撶瓑绛夛紝鎴栬€呰�鍐欐垜浠�殑鑷�畾涔夌被鍨嬨€備负浜嗘槸浠g爜灏藉彲鑳介€氱敤锛孏o 閲囧彇浜嗕竴鑷寸殑鏂瑰紡鏉ヨ�鍐欐暟鎹�€�
 
-`io` 包提供了用于读和写的接口:`io.Reader` 和 `io.Writer`
+`io` 鍖呮彁渚涗簡鐢ㄤ簬璇诲拰鍐欑殑鎺ュ彛锛歚io.Reader` 鍜� `io.Writer`
 
 ```go
 type Reader interface {
@@ -14,16 +14,16 @@ type Writer interface {
 }
 ```
 
-只要类型实现了读写接口,提供 `Read()` 和 `Write` 方法,就可以从它读取数据,或向它写入数据。一个对象要是可读的,它必须实现 `io.Reader` 接口,这个接口只有一个签名是 `Read(p []byte) (n int, err error)` 的方法,它从调用它的对象上读取数据,并把读到的数据放入参数中的字节切片中,然后返回读取的字节数和一个 `error` 对象,如果没有错误发生返回 'nil',如果已经到达输入的尾端,会返回 `io.EOF("EOF")`,如果读取的过程中发生了错误,就会返回具体的错误信息。类似地,一个对象要是可写的,它必须实现 `io.Writer` 接口,这个接口也只有一个签名是 `Write(p []byte) (n int, err error)` 的方法,它将指定字节切片中的数据写入调用它的对象里,然后返回实际写入的字节数一个 `error` 对象(如果没有错误发生就是 `nil`)。
+鍙��绫诲瀷瀹炵幇浜嗚�鍐欐帴鍙o紝鎻愪緵 `Read()` 鍜� `Write` 鏂规硶锛屽氨鍙�互浠庡畠璇诲彇鏁版嵁锛屾垨鍚戝畠鍐欏叆鏁版嵁銆備竴涓��璞¤�鏄�彲璇荤殑锛屽畠蹇呴』瀹炵幇 `io.Reader` 鎺ュ彛锛岃繖涓�帴鍙e彧鏈変竴涓��鍚嶆槸 `Read(p []byte) (n int, err error)` 鐨勬柟娉曪紝瀹冧粠璋冪敤瀹冪殑瀵硅薄涓婅�鍙栨暟鎹�紝骞舵妸璇诲埌鐨勬暟鎹�斁鍏ュ弬鏁颁腑鐨勫瓧鑺傚垏鐗囦腑锛岀劧鍚庤繑鍥炶�鍙栫殑瀛楄妭鏁板拰涓€涓� `error` 瀵硅薄锛屽�鏋滄病鏈夐敊璇�彂鐢熻繑鍥� 'nil'锛屽�鏋滃凡缁忓埌杈捐緭鍏ョ殑灏剧�锛屼細杩斿洖 `io.EOF("EOF")`锛屽�鏋滆�鍙栫殑杩囩▼涓�彂鐢熶簡閿欒�锛屽氨浼氳繑鍥炲叿浣撶殑閿欒�淇℃伅銆傜被浼煎湴锛屼竴涓��璞¤�鏄�彲鍐欑殑锛屽畠蹇呴』瀹炵幇 `io.Writer` 鎺ュ彛锛岃繖涓�帴鍙d篃鍙�湁涓€涓��鍚嶆槸 `Write(p []byte) (n int, err error)` 鐨勬柟娉曪紝瀹冨皢鎸囧畾瀛楄妭鍒囩墖涓�殑鏁版嵁鍐欏叆璋冪敤瀹冪殑瀵硅薄閲岋紝鐒跺悗杩斿洖瀹為檯鍐欏叆鐨勫瓧鑺傛暟涓€涓� `error` 瀵硅薄锛堝�鏋滄病鏈夐敊璇�彂鐢熷氨鏄� `nil`锛夈€�
 
-`io` 包里的 `Readers` 和 `Writers` 都是不带缓冲的,`bufio` 包里提供了对应的带缓冲的操作,在读写 `UTF-8` 编码的文本文件时它们尤其有用。在 第12章 我们会看在实战使用它们的很多例子。
+`io` 鍖呴噷鐨� `Readers` 鍜� `Writers` 閮芥槸涓嶅甫缂撳啿鐨勶紝`bufio` 鍖呴噷鎻愪緵浜嗗�搴旂殑甯︾紦鍐茬殑鎿嶄綔锛屽湪璇诲啓 `UTF-8` 缂栫爜鐨勬枃鏈�枃浠舵椂瀹冧滑灏ゅ叾鏈夌敤銆傚湪 绗�12绔� 鎴戜滑浼氱湅鍦ㄥ疄鎴樹娇鐢ㄥ畠浠�殑寰堝�渚嬪瓙銆�
 
-在实际编程中尽可能的使用这些接口,会使程序变得更通用,可以在任何实现了这些接口的类型上使用读写方法。
+鍦ㄥ疄闄呯紪绋嬩腑灏藉彲鑳界殑浣跨敤杩欎簺鎺ュ彛锛屼細浣跨▼搴忓彉寰楁洿閫氱敤锛屽彲浠ュ湪浠讳綍瀹炵幇浜嗚繖浜涙帴鍙g殑绫诲瀷涓婁娇鐢ㄨ�鍐欐柟娉曘€�
 
-例如一个 `JPEG` 图形解码器,通过一个 `Reader` 参数,它可以解码来自磁盘、网络连接或以 `gzip` 压缩的 `HTTP` 流中的 `JPEG`图形数据,或者其他任何实现了`Reader` 接口的对象。 
+渚嬪�涓€涓� `JPEG` 鍥惧舰瑙g爜鍣�紝閫氳繃涓€涓� `Reader` 鍙傛暟锛屽畠鍙�互瑙g爜鏉ヨ嚜纾佺洏銆佺綉缁滆繛鎺ユ垨浠� `gzip` 鍘嬬缉鐨� `HTTP` 娴佷腑鐨� `JPEG`鍥惧舰鏁版嵁锛屾垨鑰呭叾浠栦换浣曞疄鐜颁簡`Reader` 鎺ュ彛鐨勫�璞°€� 
 
-## 链接
+## 閾炬帴
 
-- [目录](directory.md)
-- 上一节:[第一个例子:使用Sorter接口排序](11.7.md)
-- 下一节:[空接口](11.9.md)
+- [鐩�綍](directory.md)
+- 涓婁竴鑺傦細[绗�竴涓�緥瀛愶細浣跨敤Sorter鎺ュ彛鎺掑簭](11.7.md)
+- 涓嬩竴鑺傦細[绌烘帴鍙�(11.9.md)

+ 41 - 41
eBook/11.9.md

@@ -1,20 +1,20 @@
-# 11.9 ソユスモソレ
+�ソ# 11.9 遨コ謗・蜿」
 
-## 11.9.1 クナト�
+## 11.9.1 讎ょソオ
 
-**ソユスモソレサ�゚ラ隯。スモソレ**イサー�ャネホコホキスキィ」ャヒ�ヤハオマヨイサラ�ホコホメェヌ�コ
+**遨コ謗・蜿」謌冶€�怙蟆乗磁蜿」**荳榊桁蜷ォ莉サ菴墓婿豕包シ悟ョ�ッケ螳樒鴫荳榊★莉サ菴戊ヲ∵アゑシ�
 
 ```go
 type Any interface {}
 ```
 
-ネホコホニ萢釥獎ヘカシハオマヨチヒソユスモソレ」ィヒ�サス��� `Java/C#` ヨミ `Object` メ�モテタ獎ヘ」ゥ」ャ`any` サ� `Any` ハヌソユスモソレメサク�ワコテオトア�釗��エ。」
+莉サ菴募�莉也アサ蝙矩�螳樒鴫莠�ゥコ謗・蜿」�亥ョ�ク堺サ�サ�ワ `Java/C#` 荳ュ `Object` 蠑慕畑邀サ蝙具シ会シ形any` 謌� `Any` 譏ッ遨コ謗・蜿」荳€荳ェ蠕亥・ス逧�悪蜷肴�郛ゥ蜀吶€�
 
-ソユスモソレタ猴ニ `Java/C#` ヨミヒ�ミタ犒トサ�爛コ `Object` タ爛ャカ�ユ゚オトトソア�イコワマ狄�」
+遨コ謗・蜿」邀サ莨シ `Java/C#` 荳ュ謇€譛臥アサ逧�渕邀サ�� `Object` 邀サ�御コ瑚€�噪逶ョ譬�ケ溷セ育嶌霑代€�
 
-ソノメヤク�サク�ユスモソレタ獎ヘオトア菽ソ `var val interface {}` クウネホコホタ獎ヘオトヨオ。」
+蜿ッ莉・扈吩ク€荳ェ遨コ謗・蜿」邀サ蝙狗噪蜿倬㍼ `var val interface {}` 襍倶ササ菴慕アサ蝙狗噪蛟シ縲�
 
-ハセタ� 11.8 empty_interface.go」コ
+遉コ萓� 11.8 empty_interface.go��
 
 ```go
 package main
@@ -56,16 +56,16 @@ func main() {
 }
 ```
 
-ハ莎�コ
+霎灘���
 
     val has the value: 5
     val has the value: ABC
     val has the value: &{Rob Pike 55}
     Type pointer to Person *main.Person
 
-ヤレノマテ豬トタ�ラモヨミ」ャスモソレア菽ソ `val` アサメタエホクウモ靨サク� `int`」ャ`string` コヘ `Person` ハオタ�オトヨオ」ャネサコ�ケモテ `type-swtich` タエイ簗ヤヒ�トハオシハタ獎ヘ。」テソク� `interface {}` ア菽ソヤレトレエ贍ミユシセンチスク�ヨウ、」コメサク�テタエエ豢「ヒ��ャオトタ獎ヘ」ャチ橫サク�テタエエ豢「ヒ��ャオトハ�センサ�゚ヨクマ��センオトヨクユ�」
+蝨ィ荳企擇逧�セ句ュ蝉クュ�梧磁蜿」蜿倬㍼ `val` 陲ォ萓晄ャ。襍倶コ井ク€荳ェ `int`�形string` 蜥� `Person` 螳樔セ狗噪蛟シ�檎┯蜷惹スソ逕ィ `type-swtich` 譚・豬玖ッ募ョ�噪螳樣刔邀サ蝙九€よッ丈クェ `interface {}` 蜿倬㍼蝨ィ蜀�ュ倅クュ蜊�謐ョ荳、荳ェ蟄鈴柄�壻ク€荳ェ逕ィ譚・蟄伜お螳�桁蜷ォ逧�アサ蝙具シ悟嘗荳€荳ェ逕ィ譚・蟄伜お螳�桁蜷ォ逧�焚謐ョ謌冶€�欠蜷第焚謐ョ逧�欠髓医€�
 
-タ�ラモ emptyint_switch.go ヒオテ�ヒソユスモソレヤレ `type-swtich` ヨミチェコマ `lambda` コッハ�オトモテキィ」コ
+萓句ュ� emptyint_switch.go 隸エ譏惹コ�ゥコ謗・蜿」蝨ィ `type-swtich` 荳ュ閨泌粋 `lambda` 蜃ス謨ー逧�畑豕包シ�
 
 ```go
 package main
@@ -101,21 +101,21 @@ func main() {
 }
 ```
 
-ハ莎�コ
+霎灘���
 
     any hello is a special String!
 
-**チキマー 11.9** simple_interface3.go」コ
+**扈�ケ� 11.9** simple_interface3.go��
 
-シフミ� チキマー11.2」ャヤレヒ�ミフ晴モメサク� `gI` コッハ�」ャヒ�サヤルスモハワ `Simpler` タ獎ヘオトイホハ�」ャカ�ヌスモハワメサク�ユスモソレイホハ�。」ネサコ�ィケ�タ獎ヘカマムヤナミカマイホハ�ハヌキ�ヌ `Simpler` タ獎ヘ。」ラ鋓�レ `main` ハケモテ `gI` ネ。エ� `fI` コッハ�イ「オ�テヒ�」ネキア」ト羞トエ惲�羯サーイネォ。」
+扈ァ扈ュ 扈�ケ�11.2�悟惠螳�クュ豺サ蜉�荳€荳ェ `gI` 蜃ス謨ー�悟ョ�ク榊�謗・蜿� `Simpler` 邀サ蝙狗噪蜿よ焚�瑚€梧弍謗・蜿嶺ク€荳ェ遨コ謗・蜿」蜿よ焚縲ら┯蜷朱€夊ソ�アサ蝙区妙險€蛻、譁ュ蜿よ焚譏ッ蜷ヲ譏ッ `Simpler` 邀サ蝙九€よ怙蜷主惠 `main` 菴ソ逕ィ `gI` 蜿紋サ」 `fI` 蜃ス謨ー蟷カ隹�畑螳�€ら。ョ菫昜ス�逧�サ」遐∬カウ螟溷ョ牙�縲�
 
-## 11.9.2 ケケスィヘィモテタ獎ヘサ��ャイサヘャタ獎ヘア菽ソオトハ�ラ
+## 11.9.2 譫�サコ騾夂畑邀サ蝙区�蛹�性荳榊酔邀サ蝙句序驥冗噪謨ー扈
 
-ヤレ 7.6.6 ヨミホメテヌソエオスチヒトワアサヒムヒ�ヘナナミ�ト `int` ハ�ラ鬘「`float` ハ�ラ鰓ヤシー `string` ハ�ラ鬟ャトヌテエカヤモレニ萢釥獎ヘオトハ�ラ鯑リ」ャハヌイサハヌホメテヌアリミ�テラヤシコア犁フハオマヨヒ�ヌ」ソ
+蝨ィ 7.6.6 荳ュ謌台サャ逵句芦莠��陲ォ謳懃エ「蜥梧賜蠎冗噪 `int` 謨ー扈�€~float` 謨ー扈�サ・蜿� `string` 謨ー扈�シ碁ぅ荵亥ッケ莠主�莉也アサ蝙狗噪謨ー扈�造�梧弍荳肴弍謌台サャ蠢�。サ蠕苓�蟾ア郛也ィ句ョ樒鴫螳�サャ��
 
-マヨヤレホメテヌヨェオタクテヤ�エラ�ヒ」ャセヘハヌヘィケ�ハケモテソユスモソレ。」ネテホメテヌク�ユスモソレカィメサク��釥獎ヘ `Element`」コ`type Element interface{}`
+邇ー蝨ィ謌台サャ遏・驕楢ッ・諤惹ケ亥★莠�シ悟ーア譏ッ騾夊ソ�スソ逕ィ遨コ謗・蜿」縲りョゥ謌台サャ扈咏ゥコ謗・蜿」螳壻ク€荳ェ蛻ォ蜷咲アサ蝙� `Element`�啻type Element interface{}`
 
-ネサコ�ィメ袵サク�ンニ�獎ヘオトス盪ケフ� `Vector`」ャヒ��ャメサク� `Element` タ獎ヘヤェヒリオトヌミニャ」コ
+辟カ蜷主ョ壻ケ我ク€荳ェ螳ケ蝎ィ邀サ蝙狗噪扈捺桷菴� `Vector`�悟ョ�桁蜷ォ荳€荳ェ `Element` 邀サ蝙句�邏�逧��迚�シ�
 
 ```go
 type Vector struct {
@@ -123,7 +123,7 @@ type Vector struct {
 }
 ```
 
-`Vector` タ�ワキナネホコホタ獎ヘオトア菽ソ」ャメ�ェネホコホタ獎ヘカシハオマヨチヒソユスモソレ」ャハオシハノマ `Vector` タ�ナオトテソク�ェヒリソノメヤハヌイサヘャタ獎ヘオトア菽ソ。」ホメテヌホェヒ�ィメ袵サク� `At()` キスキィモテモレキオサリオレ `i` ク�ェヒリ」コ
+`Vector` 驥瑚�謾セ莉サ菴慕アサ蝙狗噪蜿倬㍼�悟屏荳コ莉サ菴慕アサ蝙矩�螳樒鴫莠�ゥコ謗・蜿」�悟ョ樣刔荳� `Vector` 驥梧叛逧�ッ丈クェ蜈�エ�蜿ッ莉・譏ッ荳榊酔邀サ蝙狗噪蜿倬㍼縲よ�莉ャ荳コ螳�ョ壻ケ我ク€荳ェ `At()` 譁ケ豕慕畑莠手ソ泌屓隨ャ `i` 荳ェ蜈�エ���
 
 ```go
 func (p *Vector) At(i int) Element {
@@ -131,7 +131,7 @@ func (p *Vector) At(i int) Element {
 }
 ```
 
-ヤルカィメサク� `Set()` キスキィモテモレノ靹テオレ `i` ク�ェヒリオトヨオ」コ
+蜀榊ョ壻ク€荳ェ `Set()` 譁ケ豕慕畑莠手ョセ鄂ョ隨ャ `i` 荳ェ蜈�エ�逧�€シ��
 
 ```go
 func (p *Vector) Set(i int, e Element) {
@@ -139,26 +139,26 @@ func (p *Vector) Set(i int, e Element) {
 }
 ```
 
-`Vector` ヨミエ豢「オトヒ�ミヤェヒリカシハヌ `Element` タ獎ヘ」ャメェオテオスヒ�ヌオトヤュハシタ獎ヘ」ィunboxing」コイ�茱ゥミ靨ェモテオスタ獎ヘカマムヤ。」TODO」コThe compiler rejects assertions guaranteed to fail」ャタ獎ヘカマムヤラワハヌヤレヤヒミミハアイナヨエミミ」ャメ�ヒヒ�盍揵昤ヒミミハアエ﨔�」
+`Vector` 荳ュ蟄伜お逧�園譛牙�邏�驛ス譏ッ `Element` 邀サ蝙具シ瑚ヲ∝セ怜芦螳�サャ逧�次蟋狗アサ蝙具シ�nboxing�壽究邂ア�蛾怙隕∫畑蛻ー邀サ蝙区妙險€縲5ODO�啜he compiler rejects assertions guaranteed to fail�檎アサ蝙区妙險€諤サ譏ッ蝨ィ霑占。梧慮謇肴鴬陦鯉シ悟屏豁、螳�シ壻コァ逕溯ソ占。梧慮髞呵ッッ縲�
 
-**チキマー 11.10** min_interface.go / minmain.go」コ
+**扈�ケ� 11.10** min_interface.go / minmain.go��
 
-キツユユ11.7ヨミソェキ「オト `Sorter` スモソレ」ャエエスィメサク� `Miner` スモソレイ「ハオマヨメサミゥアリメェオトイルラ�」コッハ� `Min` スモハワメサク� `Miner` タ獎ヘア菽ソオトシッコマ」ャネサコ�ニヒ羇「キオサリシッコマヨミラ隯。オトヤェヒリ。」
+莉ソ辣ァ11.7荳ュ蠑€蜿醍噪 `Sorter` 謗・蜿」�悟�蟒コ荳€荳ェ `Miner` 謗・蜿」蟷カ螳樒鴫荳€莠帛ソ�ヲ∫噪謫堺ス懊€ょ�謨ー `Min` 謗・蜿嶺ク€荳ェ `Miner` 邀サ蝙句序驥冗噪髮�粋�檎┯蜷手ョ。邂怜ケカ霑泌屓髮�粋荳ュ譛€蟆冗噪蜈�エ�縲�
 
-## 11.9.3 クエヨニハ�センヌミニャヨチソユスモソレヌミニャ
+## 11.9.3 螟榊宛謨ー謐ョ蛻�援閾ウ遨コ謗・蜿」蛻�援
 
-シルノ霪耨ミメサク� `myType` タ獎ヘオトハ�センヌミニャ」ャト耘�ォヌミニャヨミオトハ�センクエヨニオスメサク�ユスモソレヌミニャヨミ」ャタ猴ニ」コ
+蛛�ョセ菴�譛我ク€荳ェ `myType` 邀サ蝙狗噪謨ー謐ョ蛻�援�御ス�諠ウ蟆��迚�クュ逧�焚謐ョ螟榊宛蛻ー荳€荳ェ遨コ謗・蜿」蛻�援荳ュ�檎アサ莨シ��
 
 ```go
 var dataSlice []myType = FuncReturnSlice()
 var interfaceSlice []interface{} = dataSlice
 ```
 
-ソノマァイサトワユ篥エラ�ャア默�アサ盖�惞コ`cannot use dataSlice (type []myType) as type []interface { } in assignment`
+蜿ッ諠應ク崎�霑吩ケ亥★�檎シ冶ッ第慮莨壼�髞呻シ啻cannot use dataSlice (type []myType) as type []interface { } in assignment`
 
-ヤュメ�ヌヒ�ヌチゥヤレトレエ贍ミオトイシセヨハヌイサメサム�ト」ィイホソシ[http://golang.org/doc/go_spec.html](http://golang.org/doc/go_spec.html)」ゥ。」
+蜴溷屏譏ッ螳�サャ菫ゥ蝨ィ蜀�ュ倅クュ逧�ク�ア€譏ッ荳堺ク€譬キ逧�シ亥盾閠ゼhttp://golang.org/doc/go_spec.html](http://golang.org/doc/go_spec.html)�峨€�
 
-アリミ�ケモテ `for-range` モ�菎エメサク�サク�ヤハスオリクエヨニ」コ
+蠢�。サ菴ソ逕ィ `for-range` 隸ュ蜿・譚・荳€荳ェ荳€荳ェ譏セ蠑丞慍螟榊宛��
 
 ```go
 var dataSlice []myType = FuncReturnSlice()
@@ -168,11 +168,11 @@ for ix, d := range dataSlice {
 }
 ```
 
-## 11.9.4 ヘィモテタ獎ヘオトスレオ飜�センス盪ケ
+## 11.9.4 騾夂畑邀サ蝙狗噪闃らせ謨ー謐ョ扈捺桷
 
-ヤレ10.1ヨミホメテヌモ�スチヒヨ鏸鄰ミア晗ヘハ�簷�トハ�センス盪ケ」ャヤレヒ�ヌオトカィメ袒ミハケモテチヒメサヨヨスミスレオ羞トオンケ鮨盪ケフ蠡獎ヘ」ャスレオ羃�ャメサク�ウヨヨタ獎ヘオトハ�センラヨカホ。」マヨヤレソノメヤハケモテソユスモソレラ�ェハ�センラヨカホオトタ獎ヘ」ャユ簷�メテヌセヘトワミエウ�ィモテオトエ惲�」マツテ賁ヌハオマヨメサク��イ賁�トイソキヨエ惲�コヘィモテカィメ蝪「モテモレエエスィソユスレオ羞ト `NewNode` キスキィ」ャシーノ靹テハ�センオト `SetData` キスキィ.
+蝨ィ10.1荳ュ謌台サャ驕�芦莠�ック螯ょ�陦ィ蜥梧�題ソ呎�キ逧�焚謐ョ扈捺桷�悟惠螳�サャ逧�ョ壻ケ我クュ菴ソ逕ィ莠�ク€遘榊将闃らせ逧�€貞ス堤サ捺桷菴鍋アサ蝙具シ瑚鰍轤ケ蛹�性荳€荳ェ譟千ァ咲アサ蝙狗噪謨ー謐ョ蟄玲ョオ縲ら鴫蝨ィ蜿ッ莉・菴ソ逕ィ遨コ謗・蜿」菴應クコ謨ー謐ョ蟄玲ョオ逧�アサ蝙具シ瑚ソ呎�キ謌台サャ蟆ア閭ス蜀吝�騾夂畑逧�サ」遐√€ゆク矩擇譏ッ螳樒鴫荳€荳ェ莠悟初譬醍噪驛ィ蛻�サ」遐�シ夐€夂畑螳壻ケ峨€∫畑莠主�蟒コ遨コ闃らせ逧� `NewNode` 譁ケ豕包シ悟所隶セ鄂ョ謨ー謐ョ逧� `SetData` 譁ケ豕�.
 
-ハセタ� 11.10 node_structures.go:
+遉コ萓� 11.10 node_structures.go:
 
 ```go
 package main
@@ -207,11 +207,11 @@ func main() {
 }
 ```
 
-## 11.9.5 スモソレオススモソレ
+## 11.9.5 謗・蜿」蛻ー謗・蜿」
 
-メサク�モソレオトヨオソノメヤクウヨオク�橫サク�モソレア菽ソ」ャヨサメェオライ翅獎ヘハオマヨチヒアリメェオトキスキィ。」ユ篋�ェササハヌヤレヤヒミミハアス�ミシ�魴ト」ャラェササハァーワサ盞シヨツメサク�ヒミミハアエ﨔�コユ簗ヌ 'Go' モ�ヤカッフャオトメサテ譽ャソノメヤトヌヒ�ヘ `Ruby` コヘ `Python` ユ簟ゥカッフャモ�ヤマ牾ネスマ。」
+荳€荳ェ謗・蜿」逧�€シ蜿ッ莉・襍句€シ扈吝嘗荳€荳ェ謗・蜿」蜿倬㍼�悟宵隕∝コ募アらアサ蝙句ョ樒鴫莠�ソ�ヲ∫噪譁ケ豕輔€りソ吩クェ霓ャ謐「譏ッ蝨ィ霑占。梧慮霑幄。梧」€譟・逧�シ瑚スャ謐「螟ア雍・莨壼ッシ閾エ荳€荳ェ霑占。梧慮髞呵ッッ�夊ソ呎弍 'Go' 隸ュ險€蜉ィ諤∫噪荳€髱「�悟庄莉・驍」螳�柱 `Ruby` 蜥� `Python` 霑吩コ帛勘諤∬ッュ險€逶ク豈碑セ�€�
 
-シルカィ」コ
+蛛�ョ夲シ�
 
 ```go
 var ai AbsInterface // declares method Abs()
@@ -223,18 +223,18 @@ pp := new(Point) // say *Point implements Abs, Sqr
 var empty interface{}
 ```
 
-トヌテエマツテ豬トモ�莠ヘタ獎ヘカマムヤハヌコマキィオト」コ
+驍」荵井ク矩擇逧�ッュ蜿・蜥檎アサ蝙区妙險€譏ッ蜷域ウ慕噪��
 
 ```go
 empty = pp                // everything satisfies empty
 ai = empty.(AbsInterface) // underlying value pp implements Abs()
 // (runtime failure otherwise)
-si = ai.(SqrInterface) // *Point has Sqr() even though AbsInterface doesn。ッt
+si = ai.(SqrInterface) // *Point has Sqr() even though AbsInterface doesn窶冲
 empty = si             // *Point implements empty set
 // Note: statically checkable so type assertion not necessary.
 ```
 
-マツテ賁ヌコッハ�オ�テオトメサク��ラモ」コ
+荳矩擇譏ッ蜃ス謨ー隹�畑逧�ク€荳ェ萓句ュ撰シ�
 
 ```go
 type myPrintInterface interface {
@@ -246,10 +246,10 @@ func f3(x myInterface) {
 }
 ```
 
-`x` ラェササホェ `myPrintInterface` タ獎ヘハヌヘ�ォカッフャオト」コヨサメェ `x` オトオライ翅獎ヘ」ィカッフャタ獎ヘ」ゥカィメ蠱ヒ `print` キスキィユ篋��テセヘソノメヤユ�ウ」ヤヒミミ。」
+`x` 霓ャ謐「荳コ `myPrintInterface` 邀サ蝙区弍螳悟�蜉ィ諤∫噪�壼宵隕� `x` 逧�コ募アらアサ蝙具シ亥勘諤∫アサ蝙具シ牙ョ壻ケ我コ� `print` 譁ケ豕戊ソ吩クェ隹�畑蟆ア蜿ッ莉・豁」蟶ク霑占。後€�
 
-## チエスモ
+## 體セ謗・
 
-- [トソツシ](directory.md)
-- ノマメサスレ」コ[オレカ�ク��ラモ」コカチコヘミエ](11.8.md)
-- マツメサスレ」コ[キエノ莢�(11.10.md)
+- [逶ョ蠖評(directory.md)
+- 荳贋ク€闃ゑシ喙隨ャ莠御クェ萓句ュ撰シ夊ッサ蜥悟�](11.8.md)
+- 荳倶ク€闃ゑシ喙蜿榊ー�桁](11.10.md)