上QQ阅读APP看书,第一时间看更新
2.3.2 DirEntry
在4种实现中,DirEntry相对简单一些,表示目录形式的类路径。在ch02\classpath目录下创建entry_dir.go文件,在其中定义DirEntry结构体,代码如下:
package classpath import "io/ioutil" import "path/filepath" type DirEntry struct { absDir string } func newDirEntry(path string) *DirEntry {...} func (self *DirEntry) readClass(className string) ([]byte , Entry, error) {...} func (self *DirEntry) String() string {...}
DirEntry只有一个字段,用于存放目录的绝对路径。和Java语言不同,Go结构体不需要显示实现接口,只要方法匹配即可。Go没有专门的构造函数,本书统一使用new开头的函数来创建结构体实例,并把这类函数称为构造函数。newDirEntry()函数的代码如下:
func newDirEntry(path string) *DirEntry { absDir, err := filepath.Abs(path) if err ! = nil { panic(err) } return &DirEntry{absDir} }
newDirEntry()先把参数转换成绝对路径,如果转换过程出现错误,则调用panic()函数终止程序执行,否则创建DirEntry实例并返回。
下面介绍readClass()方法:
func (self *DirEntry) readClass(className string) ([]byte, Entry, error) { fileName := filepath.Join(self.absDir, className) data, err := ioutil.ReadFile(fileName) return data, self, err }
readClass()先把目录和class文件名拼成一个完整的路径,然后调用ioutil包提供的ReadFile()函数读取class文件内容,最后返回。String()方法很简单,直接返回目录,代码如下:
func (self *DirEntry) String() string { return self.absDir }