golang之interface(接口)与 reflect 机制

简介: 一、概述   什么是interface,简单的说,interface是一组method的组合,通过interface来定义对象的一组行为;   interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口; 1 package main 2 ...

一、概述

  什么是interface,简单的说,interface是一组method的组合,通过interface来定义对象的一组行为;

  interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口;

  1 package main
  2 
  3 import "fmt"
  4 
  5 type Human struct {
  6     name  string
  7     age   int 
  8     phone string
  9 }
 10 
 11 type Student struct {
 12     Human  //匿名函数
 13     school string
 14     loan   float32
 15 }
 16 
 17 type Employee struct {
 18     Human
 19     company string
 20     money   float32
 21 }
 22 
 23 //Human对象实现Sayhi方法
 24 func (h *Human) Sayhi() {
 25     fmt.Printf("hi, I am %s you can call me on %s\n", h.name, h.phone)
 26 }
 27 
 28 //Human对象实现了Sing方法
 29 func (h *Human) Sing(lyrics string) {
 30     fmt.Println("lalala...", lyrics)
 31 }
 32 
 33 //Human对象实现了Guzzle方法
 34 func (h *Human) Guzzle(beerStein string) {
 35     fmt.Println("Guzzle Guzzle...", beerStein)
 36 }
 37 
 38 //Student 实现了BorrowMoney方法
 39 func (s *Student) BorrowMoney(amount float32) {
 40     s.loan += amount
 41 }
 42 
 43 //Empolyee 重载了Human的Sayhi的方法
 44 func (e *Employee) Sayhi() {
 45     fmt.Printf("hi, I am %s, I work at %s. call me on %s\n", e.name, e.company, e.phone)
 46 }
 47 
 48 //Employee实现了SpendSalary的方法
 49 func (e *Employee) SpendSalary(amount float32) {
 50     e.money -= amount
 51 }
 52 
 53 //define interface
 54 /*
 55 type Men interface {
 56     Sayhi()
 57     Sing(lyrics string)
 58     Guzzle(beerStein string)
 59 }
 60 
 61 type YoungChap interface {
 62     Sayhi()
 63     Sing(song string)
 64     BorrowMoney(amount float32)
 65 }
 66 
 67 type ElderlyGent interface {
 68     Sayhi()
 69     Sing(song string)
 70     SpendSalary(amount float32)
 71 }
 72 */
 73 
 74 //interface Men被Human,Student, Employee都实现
 75 // Student, Employee包含了Human匿名字段,所有也包含了其接口实现
 76 type Men interface {
 77     Sayhi()
 78     Sing(lyrics string)
 79 }
 80 
 81 func main() {
 82     mike := Student{Human{"Mike", 24, "22-22-xx"}, "MIT", 0.00}
 83     paul := Student{Human{"paul", 26, "23-32-xx"}, "Harvard", 5.00}
 84     sam := Employee{Human{"Sam", 46, "33-33-33"}, "Gling inc", 1000}
 85     Tom := Employee{Human{"Tom", 33, "33-334-11"}, "Things ltd", 400}
 86 
 87     var i Men //interface type
 88     i = &mike
 89     fmt.Println("this is Mike, a Student\n")
 90     i.Sayhi()
 91     i.Sing("my name is Mike")
 92 
 93     i = &Tom
 94     fmt.Println("this is Tom, an employee\n")
 95     i.Sayhi()
 96     i.Sing("my name is Tom")
 97 
 98     x := make([]Men, 3)
 99     x[0], x[1], x[2] = &paul, &sam, &mike
100     for _, value := range x {
101         value.Sayhi()
102     }
103 }

二、反射机制

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "reflect"
 6 )
 7 
 8 func main() {
 9     var x float64 = 3.4
10     p := reflect.ValueOf(&x)
11     v := p.Elem()
12     fmt.Println(v)
13     v.SetFloat(8.3)
14     fmt.Println(v)
15 }

 

相关文章
|
6月前
|
Go
|
6月前
|
JSON Go 数据格式
【Golang】解决使用interface{}解析json数字会变成科学计数法的问题
【2月更文挑战第9天】解决使用interface{}解析json数字会变成科学计数法的问题
168 0
|
2月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
78 4
|
2月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
45 3
|
2月前
|
Go
Golang语言基础之接口(interface)及类型断言
这篇文章是关于Go语言中接口(interface)及类型断言的详细教程,涵盖了接口的概念、定义、实现、使用注意事项以及类型断言的多种场景和方法。
33 4
|
3月前
|
JSON 人工智能 编译器
Go json 能否解码到一个 interface 类型的值
Go json 能否解码到一个 interface 类型的值
29 1
|
3月前
|
Go
Go - struct{} 实现 interface{}
Go - struct{} 实现 interface{}
39 9
|
3月前
|
监控 Go
|
3月前
|
Go 开发者
Golang 中的异常处理机制详解
【8月更文挑战第31天】
42 0
|
6月前
|
JSON Go 数据格式
golang学习7,glang的web的restful接口结构体传参
golang学习7,glang的web的restful接口结构体传参