<commit_before>#2.6interface

##interface
Go语言里面设计最精妙的应该算interface，它让面向对象，内容组织实现非常的方便，当你看完这一章，你就会被interface的巧妙设计所折服。
###什么是interface
简单的说，interface是一组method的组合，我们通过interface来定义对象的一组行为。

我们前面一章最后一个例子中Student和Employee都能Sayhi，虽然他们的内部实现不一样，但是那不重要，重要的是他们都能`say hi`

让我们来继续做更多的扩展，Student和Employee实现另一个方法`Sing`，然后Student实现方法BorrowMoney而Employee实现SpendSalary。

这样Student实现了三个方法：Sayhi、Sing、BorrowMoney；而Employee实现了Sayhi、Sing、SpendSalary。

上面这些方法的组合称为interface(被对象Student和Employee实现)。例如Student和Employee都实现了interface：Sayhi和Sing，也就是这两个对象是该interface类型。而Employee没有实现这个interface：Sayhi、Sing和BorrowMoney，因为Employee没有实现BorrowMoney这个方法。
###interface类型
interface类型定义了一组方法，如果某个对象实现了某个接口的所有方法，则此对象就实现了此接口。详细的语法参考下面这个例子

	type Human struct {
    	name string
    	age int
    	phone string
	}
	
	type Student struct {
	    Human //匿名字段Human
	    school string
	    loan float32
	}
	
	type Employee struct {
	    Human //匿名字段Human
	    company string
	    money float32
	}
	
	//Human对象实现Sayhi方法
	func (h *Human) SayHi() {
	    fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
	}
	
	// Human对象实现Sing方法
	func (h *Human) Sing(lyrics string) {
	    fmt.Println("La la, la la la, la la la la la...", lyrics)
	}
	
	//Human对象实现Guzzle方法
	func (h *Human) Guzzle(beerStein string) {
	    fmt.Println("Guzzle Guzzle Guzzle...", beerStein)
	}
	
	// Employee重载Human的Sayhi方法
	func (e *Employee) SayHi() {
	    fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name,
	        e.company, e.phone) //Yes you can split into 2 lines here.
	}
	
	//Student实现BorrowMoney方法
	func (s *Student) BorrowMoney(amount float32) {
	    loan += amount // (again and again and...)
	}
	
	//Employee实现SpendSalary方法
	func (e *Employee) SpendSalary(amount float32) {
	    e.money -= amount // More vodka please!!! Get me through the day!
	}
	
	// 定义interface
	type Men interface {
	    SayHi()
	    Sing(lyrics string)
	    Guzzle(beerStein string)
	}
	
	type YoungChap interface {
	    SayHi()
	    Sing(song string)
	    BorrowMoney(amount float32)
	}
	
	type ElderlyGent interface {
	    SayHi()
	    Sing(song string)
	    SpendSalary(amount float32)
	}
	
通过上面的代码我们可以知道，interface可以被任意的对象实现。我们看到上面的Men interface被Human、Student和Employee实现。同理，一个对象可以实现任意多个interface，例如上面的Student实现了Men和YonggChap两个interface。

最后，任意的类型都实现了空interface(我们这样定义：interface{})，也就是包含0个method的interface。

###interface值<commit_msg>修复一些错误<commit_after>#2.6interface

##interface
Go语言里面设计最精妙的应该算interface，它让面向对象，内容组织实现非常的方便，当你看完这一章，你就会被interface的巧妙设计所折服。
###什么是interface
简单的说，interface是一组method的组合，我们通过interface来定义对象的一组行为。

我们前面一章最后一个例子中Student和Employee都能Sayhi，虽然他们的内部实现不一样，但是那不重要，重要的是他们都能`say hi`

让我们来继续做更多的扩展，Student和Employee实现另一个方法`Sing`，然后Student实现方法BorrowMoney而Employee实现SpendSalary。

这样Student实现了三个方法：Sayhi、Sing、BorrowMoney；而Employee实现了Sayhi、Sing、SpendSalary。

上面这些方法的组合称为interface(被对象Student和Employee实现)。例如Student和Employee都实现了interface：Sayhi和Sing，也就是这两个对象是该interface类型。而Employee没有实现这个interface：Sayhi、Sing和BorrowMoney，因为Employee没有实现BorrowMoney这个方法。
###interface类型
interface类型定义了一组方法，如果某个对象实现了某个接口的所有方法，则此对象就实现了此接口。详细的语法参考下面这个例子

	type Human struct {
    	name string
    	age int
    	phone string
	}
	
	type Student struct {
	    Human //匿名字段Human
	    school string
	    loan float32
	}
	
	type Employee struct {
	    Human //匿名字段Human
	    company string
	    money float32
	}
	
	//Human对象实现Sayhi方法
	func (h *Human) SayHi() {
	    fmt.Printf("Hi, I am %s you can call me on %s\n", h.name, h.phone)
	}
	
	// Human对象实现Sing方法
	func (h *Human) Sing(lyrics string) {
	    fmt.Println("La la, la la la, la la la la la...", lyrics)
	}
	
	//Human对象实现Guzzle方法
	func (h *Human) Guzzle(beerStein string) {
	    fmt.Println("Guzzle Guzzle Guzzle...", beerStein)
	}
	
	// Employee重载Human的Sayhi方法
	func (e *Employee) SayHi() {
	    fmt.Printf("Hi, I am %s, I work at %s. Call me on %s\n", e.name,
	        e.company, e.phone) //Yes you can split into 2 lines here.
	}
	
	//Student实现BorrowMoney方法
	func (s *Student) BorrowMoney(amount float32) {
	    s.loan += amount // (again and again and...)
	}
	
	//Employee实现SpendSalary方法
	func (e *Employee) SpendSalary(amount float32) {
	    e.money -= amount // More vodka please!!! Get me through the day!
	}
	
	// 定义interface
	type Men interface {
	    SayHi()
	    Sing(lyrics string)
	    Guzzle(beerStein string)
	}
	
	type YoungChap interface {
	    SayHi()
	    Sing(song string)
	    BorrowMoney(amount float32)
	}
	
	type ElderlyGent interface {
	    SayHi()
	    Sing(song string)
	    SpendSalary(amount float32)
	}
	
通过上面的代码我们可以知道，interface可以被任意的对象实现。我们看到上面的Men interface被Human、Student和Employee实现。同理，一个对象可以实现任意多个interface，例如上面的Student实现了Men和YonggChap两个interface。

最后，任意的类型都实现了空interface(我们这样定义：interface{})，也就是包含0个method的interface。

###interface值
{'fraction_non_alphanumeric': 0.0979065341509833, 'fraction_numerical': 0.006766758299851977, 'mean_word_length': 4.375, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5634842', 'n_tokens_mistral': 2323, 'n_tokens_neox': 2145, 'n_words': 335}