golang接口使用记录
1. 总述
接口类型是对其他类型行为的概括与抽象,Go语言的独特之在于它是隐式实现,无需申明它实现哪些接口,只要提供接口所必须的方法即可。
接口即约定
实现单词和行的计数器,考虑使用bufio.ScanWords
// counter.go
// 计数器
type Counter interface {
Count(fileName string) error
}
// 单词计数
type WordCount int
func (w *WordCount) Count(fileName string) error {
file, err := os.Open(fileName)
if err != nil {
return errors.New("open file fail: " + err.Error())
}
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
count := 0
for scanner.Scan() {
count += 1
}
*w = WordCount(count)
return nil
}
// 行计数器
type LineCount int
func (l *LineCount) Count(fileName string) error {
file, err := os.Open(fileName)
if err != nil {
return errors.New("open file fail: " \+ err.Error())
}
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)
count := 0
for scanner.Scan() {
count += 1
}
*l = LineCount(count)
return nil
}
// counter_test.go
// 计数器单测
func TestWordCount_Count(t *testing.T) {
var w WordCount
if err := w.Count("log"); err != nil {
t.Errorf("word count fail: %s", err.Error())
return
}
if w != 7 {
t.Error("word count not equal to 7")
}
t.Log("word count success")
}
func TestLineCount_Count(t *testing.T) {
var l LineCount
if err := l.Count("log"); err != nil {
t.Errorf("line count fail: %s", err.Error())
return
}
if l != 4 {
t.Error("line count not equal to 4")
}
t.Log("line count success")
}
有疑问加站长微信联系(非本文作者)