教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang之interface(接口)与 reflect 机制

golang之interface(接口)与 reflect 机制

发布时间:2021-12-16   编辑:jiaochengji.com
教程集为您提供golang之interface(接口)与 reflect 机制等资源,欢迎您收藏本站,我们将为您提供最新的golang之interface(接口)与 reflect 机制资源

一、概述

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

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

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

二、反射机制

<pre><span style="color: #008080;"> 1</span> <span style="color: #000000;">package main </span><span style="color: #008080;"> 2</span> <span style="color: #008080;"> 3</span> <span style="color: #000000;">import ( </span><span style="color: #008080;"> 4</span> <span style="color: #800000;">"</span><span style="color: #800000;">fmt</span><span style="color: #800000;">"</span> <span style="color: #008080;"> 5</span> <span style="color: #800000;">"</span><span style="color: #800000;">reflect</span><span style="color: #800000;">"</span> <span style="color: #008080;"> 6</span> <span style="color: #000000;">) </span><span style="color: #008080;"> 7</span> <span style="color: #008080;"> 8</span> <span style="color: #000000;">func main() { </span><span style="color: #008080;"> 9</span> <span style="color: #0000ff;">var</span> x float64 = <span style="color: #800080;">3.4</span> <span style="color: #008080;">10</span> p := reflect.ValueOf(&<span style="color: #000000;">x) </span><span style="color: #008080;">11</span> v :=<span style="color: #000000;"> p.Elem() </span><span style="color: #008080;">12</span> <span style="color: #000000;"> fmt.Println(v) </span><span style="color: #008080;">13</span> v.SetFloat(<span style="color: #800080;">8.3</span><span style="color: #000000;">) </span><span style="color: #008080;">14</span> <span style="color: #000000;"> fmt.Println(v) </span><span style="color: #008080;">15</span> }</pre>

 


到此这篇关于“golang之interface(接口)与 reflect 机制”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang 结构体断言_Golang中的reflect原理
Golang反射机制的实现分析——reflect.Type类型名称
golang的反射机制与实践(上)
图解 Go 反射实现原理
Golang reflect机制实现struct 复制/选择复制
golang标准库reflect包实现操作任意类型对象
golang 面试题(十三)interface内部结构和nil详解
go-反射机制
Go 之 interface接口理解
Go语言interface详解

[关闭]
~ ~