Merge pull request #111 from JessonChan/master

diff
This commit is contained in:
astaxie
2012-11-07 17:26:28 -08:00

10
2.6.md
View File

@@ -187,12 +187,12 @@ interface类型定义了一组方法如果某个对象实现了某个接口
### interface函数参数
interface的变量可以持有任意实现该interface类型的对象这给我们编写函数(包括method)提供了一些额外的思考我们是不是可以通过定义interface参数让函数接受各种类型的参数。
举个例子:我们已经知道fmt.Println是我们常用的一个函数但是你是否注意到它可以接受任意类型的数据。打开fmt的源码文件你会看到这样一个定义:
举个例子fmt.Println是我们常用的一个函数但是你是否注意到它可以接受任意类型的数据。打开fmt的源码文件你会看到这样一个定义:
type Stringer interface {
String() string
}
任何实现了String方法的类型都能作为参数去调用fmt.Println,让我们来试一试
也就是说,任何实现了String方法的类型都能作为参数fmt.Println调用,让我们来试一试
package main
import (
@@ -356,12 +356,12 @@ Go里面真正吸引人的是他内置的逻辑语法就像我们在学习Str
### 反射
Go语言实现了反射所谓反射就是动态运行时的状态。我们一般用到的包是reflect包。如何运用reflect包官方的这篇文章详细的讲解了reflect包的实现原理[laws of reflection](http://golang.org/doc/articles/laws_of_reflection.html)
下面我简要的讲解一下一般的使用,我们使用reflect大概的分成三步,首先我们要去反射是一个类型的值(这些值都实现了空interface)需要把它转化成reflect对象(reflect.Type或者reflect.Value根据不同的情况调用不同的函数)。这两种获取方式如下:
使用reflect一般分成三步,下面简要的讲解一下:要去反射是一个类型的值(这些值都实现了空interface)首先需要把它转化成reflect对象(reflect.Type或者reflect.Value根据不同的情况调用不同的函数)。这两种获取方式如下:
t := reflect.TypeOf(i) //得到类型的元数据,通过t我们能获取类型定义里面的所有元素
v := reflect.ValueOf(i) //得到实际的值通过v我们获取存储在里面的值还可以去改变值
获取这个对象之后我们就可以进行一些操作了也就是reflect对象转化成相应的值例如
转化为reflect对象之后我们就可以进行一些操作了,也就是reflect对象转化成相应的值例如
tag := t.Elem().Field(0).Tag //获取定义在strcut里面的标签
name := v.Elem().Field(0).String() //获取存储在第一个字段里面的值
@@ -387,7 +387,7 @@ Go语言实现了反射所谓反射就是动态运行时的状态。我们一
v := p.Elem()
v.SetFloat(7.1)
使用反射需要自己在编程中不断的深入去了解,我这边只能大概的介绍一些
上面只是对反射的简单介绍,更深入的理解还需要自己在编程中不断的实践
## links
* [目录](<preface.md>)