当前位置: 首页 > news >正文

专做火影黄图的网站复古传奇手游排行榜第一名

专做火影黄图的网站,复古传奇手游排行榜第一名,邢台网站推广报价,百度收录好的免费网站#x1f337;#x1f341; 博主猫头虎#x1f405;#x1f43e; 带您进入 Golang 语言的新世界✨✨#x1f341; #x1f984; 博客首页——#x1f405;#x1f43e;猫头虎的博客#x1f390; #x1f433; 《面试题大全专栏》 #x1f995; 文章图文并茂#x1f… 博主猫头虎 带您进入 Golang 语言的新世界✨✨ 博客首页——猫头虎的博客 《面试题大全专栏》 文章图文并茂生动形象简单易学欢迎大家来踩踩~ 《IDEA开发秘籍专栏》 学会IDEA常用操作工作效率翻倍~ 《100天精通Golang(基础入门篇》 学会Golang语言畅游云原生领域无厂不可去~ 希望本文能给您带来价值如果有任何不足欢迎批评指正 100天精通Golang基础入门篇 100天精通Golang基础入门篇——第20天接口摘要导语引言1.1 什么是接口?1.2 接口的定义语法1.3 interface值1.4 接口的类型1.5 接口断言1.6 接口的组合1.7 接口的零值和nil1.8 接口和指针1.9 接口嵌套和方法冲突1.10 接口的实用技巧1.11 错误处理与接口1.12 测试与接口总结参考资料 结语 100天精通Golang基础入门篇——第20天接口 摘要 第二十天来了继续我们的 “100天精通Golang基础入门篇” 旅程今天的重点是Golang 接口深度解析☞从基础到高级。本篇将全方位地揭示接口在 Golang 中的重要性以及如何让你的代码更加模块化、可测试和可维护。 探究 Golang 的接口机制如何使代码更加模块化、可测试和可维护。本文将从接口的定义、使用到高级特性进行全面剖析。 导语 大家好我是猫头虎今天我们将一同进入 Golang 的神秘花园探寻接口Interface的无穷魅力。如果你对如何有效地使用 Golang 的接口机制感到好奇那么这篇文章一定适合你。 引言 在面向对象编程中接口是一个非常重要的概念。但在 Golang 中接口不仅用于描述对象的行为还有许多高级的用途和特性。这使得 Golang 在类型系统的设计上显得非常独特和灵活。接口可以用于多态、代码解耦、错误处理等多个方面其强大的功能和灵活性使得它成为 Golang 不可或缺的一部分。 1.1 什么是接口? 面向对象世界中的接口的一般定义是“接口定义对象的行为”。它表示让指定对象应该做什么。实现这种行为的方法(实现细节)是针对对象的。 在Go中接口是一组方法签名。当类型为接口中的所有方法提供定义时它被称为实现接口。它与OOP非常相似。接口指定了类型应该具有的方法类型决定了如何实现这些方法。 它把所有的具有共性的方法定义在一起任何其他类型只要实现了这些方法就是实现了这个接口 接口定义了一组方法如果某个对象实现了某个接口的所有方法则此对象就实现了该接口。 1.2 接口的定义语法 定义接口 /* 定义接口 */ type interface_name interface {method_name1 [return_type]method_name2 [return_type]method_name3 [return_type]...method_namen [return_type] }/* 定义结构体 */ type struct_name struct {/* variables */ }/* 实现接口方法 */ func (struct_name_variable struct_name) method_name1() [return_type] {/* 方法实现 */ } ... func (struct_name_variable struct_name) method_namen() [return_type] {/* 方法实现*/ }示例代码 package mainimport (fmt )type Phone interface {call() }type NokiaPhone struct { }func (nokiaPhone NokiaPhone) call() {fmt.Println(I am Nokia, I can call you!) }type IPhone struct { }func (iPhone IPhone) call() {fmt.Println(I am iPhone, I can call you!) }func main() {var phone Phonephone new(NokiaPhone)phone.call()phone new(IPhone)phone.call()}运行结果 I am Nokia, I can call you! I am iPhone, I can call you!interface可以被任意的对象实现一个对象可以实现任意多个interface任意的类型都实现了空interface(我们这样定义interface{})也就是包含0个method的interface 1.3 interface值 package mainimport fmttype Human struct {name stringage intphone string } type Student struct {Human //匿名字段school stringloan float32 } type Employee struct {Human //匿名字段company stringmoney 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..., lyrics) } //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. }// Interface Men被Human,Student和Employee实现 // 因为这三个类型都实现了这两个方法 type Men interface {SayHi()Sing(lyrics string) }func main() {mike : Student{Human{Mike, 25, 222-222-XXX}, MIT, 0.00}paul : Student{Human{Paul, 26, 111-222-XXX}, Harvard, 100}sam : Employee{Human{Sam, 36, 444-222-XXX}, Golang Inc., 1000}Tom : Employee{Human{Sam, 36, 444-222-XXX}, Things Ltd., 5000}//定义Men类型的变量ivar i Men//i能存储Studenti mikefmt.Println(This is Mike, a Student:)i.SayHi()i.Sing(November rain)//i也能存储Employeei Tomfmt.Println(This is Tom, an Employee:)i.SayHi()i.Sing(Born to be wild)//定义了slice Menfmt.Println(Lets use a slice of Men and see what happens)x : make([]Men, 3)//T这三个都是不同类型的元素但是他们实现了interface同一个接口x[0], x[1], x[2] paul, sam, mikefor _, value : range x {value.SayHi()} }运行结果 This is Mike, a Student:Hi, I am Mike you can call me on 222-222-XXXLa la la la... November rainThis is Tom, an Employee:Hi, I am Sam, I work at Things Ltd.. Call me on 444-222-XXXLa la la la... Born to be wildLets use a slice of Men and see what happensHi, I am Paul you can call me on 111-222-XXXHi, I am Sam, I work at Golang Inc.. Call me on 444-222-XXXHi, I am Mike you can call me on 222-222-XXX那么interface里面到底能存什么值呢如果我们定义了一个interface的变量那么这个变量里面可以存实现这个interface的任意类型的对象。例如上面例子中我们定义了一个Men interface类型的变量m那么m里面可以存Human、Student或者Employee值 当然使用指针的方式也是可以的 但是接口对象不能调用实现对象的属性 interface函数参数 interface的变量可以持有任意实现该interface类型的对象这给我们编写函数(包括method)提供了一些额外的思考我们是不是可以通过定义interface参数让函数接受各种类型的参数 嵌入interface package mainimport fmttype Human interface {Len() } type Student interface {Human }type Test struct { }func (h *Test) Len() {fmt.Println(成功) } func main() {var s Students new(Test)s.Len() }示例代码 package testimport (fmt )type Controller struct {M int32 }type Something interface {Get()Post() }func (c *Controller) Get() {fmt.Print(GET) }func (c *Controller) Post() {fmt.Print(POST) }package mainimport (fmttest )type T struct {test.Controller }func (t *T) Get() {//new(test.Controller).Get()fmt.Print(T) } func (t *T) Post() {fmt.Print(T) } func main() {var something test.Somethingsomething new(T)var t Tt.M 1// t.Controller.M 1something.Get() }Controller实现了所有的Something接口方法当结构体T中调用Controller结构体的时候T就相当于Java中的继承T继承了Controller因此T可以不用重写所有的Something接口中的方法因为父构造器已经实现了接口。 如果Controller没有实现Something接口方法则T要调用Something中方法就要实现其所有方法。 如果something new(test.Controller)则调用的是Controller中的Get方法。 T可以使用Controller结构体中定义的变量 1.4 接口的类型 接口与鸭子类型 先直接来看维基百科里的定义 If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck. 翻译过来就是如果某个东西长得像鸭子像鸭子一样游泳像鸭子一样嘎嘎叫那它就可以被看成是一只鸭子。 Duck Typing鸭子类型是动态编程语言的一种对象推断策略它更关注对象能如何被使用而不是对象的类型本身。Go 语言作为一门静态语言它通过通过接口的方式完美支持鸭子类型。 而在静态语言如 Java, C 中必须要显示地声明实现了某个接口之后才能用在任何需要这个接口的地方。如果你在程序中调用某个数却传入了一个根本就没有实现另一个的类型那在编译阶段就不会通过。这也是静态语言比动态语言更安全的原因。 动态语言和静态语言的差别在此就有所体现。静态语言在编译期间就能发现类型不匹配的错误不像动态语言必须要运行到那一行代码才会报错。当然静态语言要求程序员在编码阶段就要按照规定来编写程序为每个变量规定数据类型这在某种程度上加大了工作量也加长了代码量。动态语言则没有这些要求可以让人更专注在业务上代码也更短写起来更快这一点写 python 的同学比较清楚。 Go 语言作为一门现代静态语言是有后发优势的。它引入了动态语言的便利同时又会进行静态语言的类型检查写起来是非常 Happy 的。Go 采用了折中的做法不要求类型显示地声明实现了某个接口只要实现了相关的方法即可编译器就能检测到。 总结一下鸭子类型是一种动态语言的风格在这种风格中一个对象有效的语义不是由继承自特定的类或实现特定的接口而是由它当前方法和属性的集合决定。Go 作为一种静态语言通过接口实现了鸭子类型实际上是 Go 的编译器在其中作了隐匿的转换工作。 Go语言的多态性 Go中的多态性是在接口的帮助下实现的。正如我们已经讨论过的接口可以在Go中隐式地实现。如果类型为接口中声明的所有方法提供了定义则实现一个接口。让我们看看在接口的帮助下如何实现多态。 任何定义接口所有方法的类型都被称为隐式地实现该接口。 类型接口的变量可以保存实现接口的任何值。接口的这个属性用于实现Go中的多态性。 1.5 接口断言 前面说过因为空接口 interface{}没有定义任何函数因此 Go 中所有类型都实现了空接口。当一个函数的形参是interface{}那么在函数中需要对形参进行断言从而得到它的真实类型。 语法格式 // 安全类型断言目标类型的值布尔参数 : 表达式.( 目标类型 )//非安全类型断言目标类型的值 : 表达式.( 目标类型 ) 示例代码 package mainimport fmtfunc main() {var i1 interface{} new (Student)s : i1.(Student) //不安全如果断言失败会直接panicfmt.Println(s)var i2 interface{} new(Student)s, ok : i2.(Student) //安全断言失败也不会panic只是ok的值为falseif ok {fmt.Println(s)} }type Student struct {} 断言其实还有另一种形式就是用在利用 switch语句判断接口的类型。每一个case会被顺序地考虑。当命中一个case 时就会执行 case 中的语句因此 case 语句的顺序是很重要的因为很有可能会有多个 case匹配的情况。 示例代码 switch ins:s.(type) {case Triangle:fmt.Println(三角形。。。,ins.a,ins.b,ins.c)case Circle:fmt.Println(圆形。。。。,ins.radius)case int:fmt.Println(整型数据。。)}1.6 接口的组合 在 Go 语言中一个接口可以由多个小接口组合而成。这样的组合方式提供了一种“继承”的感觉使得接口更加模块化。 type Reader interface {Read(p []byte) (n int, err error) }type Writer interface {Write(p []byte) (n int, err error) }type ReadWriter interface {ReaderWriter }在这个例子中ReadWriter 接口组合了 Reader 和 Writer 接口一个实现了 ReadWriter 接口的类必须实现所有 Reader 和 Writer 接口中定义的方法。 1.7 接口的零值和nil 在 Go 中接口内部有两个组件一个是具体的类型另一个是该类型的值。当我们定义一个接口变量时这两个组件都会初始化为 nil。 var a interface{} fmt.Printf(%v, %T\n, a, a) // nil, nil当一个接口变量的类型和值都为 nil 时我们称该变量为 nil 接口变量。 1.8 接口和指针 指针类型和它所指向的值类型是两个不同的类型因此如果一个接口类型的方法集合包含使用值接收者定义的方法那么这个接口可以存储这个指针类型的值。 type Describer interface {Describe() }type Person struct {name string }func (p Person) Describe() {fmt.Println(I am a person.) }func main() {var d1 Describerp1 : Person{Sam}d1 p1d1.Describe() }1.9 接口嵌套和方法冲突 接口也可以嵌套接口但要注意方法不要冲突。 type ReadCloser interface {ReaderCloser } type Closer interface {Close() error//Read() // 这里如果定义Read方法将与Reader接口冲突 }1.10 接口的实用技巧 类型查询: 除了类型断言你还可以使用 , ok 语法来安全地查询值的类型。 if val, ok : myVar.(MyType); ok {// ... }使用接口收集不同类型的值: 你可以创建接受接口类型参数的函数或方法以处理不同类型的值。 使用接口实现模板模式: 通过定义一个接口来封装算法的变化然后通过具体的类型来实现算法的可替换部分。 1.11 错误处理与接口 Go 语言中的错误处理也是基于接口的。标准库中有一个 error 接口用于处理错误 type error interface {Error() string }自定义错误通常会实现这个接口提供更多的上下文信息和错误处理能力。 1.12 测试与接口 在 Go 中进行单元测试时接口非常有用。你可以创建模拟对象来代替真实的依赖这些模拟对象实现了同样的接口。 这样的话你可以在测试环境下替换这些依赖使得单元测试更加容易编写和维护。 总结 通过本文你应该对 Golang 的接口有了全面且深入的理解。无论是基础的类型实现还是高级的接口组合和多态性接口都能让我们的代码更加简洁和高效。掌握接口不仅可以让你更加自如地使用 Golang也会极大地提升你的编程水平。记住掌握接口就是走向 Golang 高手之路的关键一步。 接口在 Go 中是一种非常强大和灵活的机制用于解耦和组织代码。它们提供了一种方式来规范对象行为允许我们编写可复用和可测试的代码。了解和掌握接口是成为 Go 语言高手的关键之一。 参考资料 Go Programming Language SpecificationEffective GoGo Blog: Interfaces in GoGo by Example: Interfaces 希望大家喜欢这篇文章如果你有任何问题或想要进一步探讨随时在下方留言。 不要忘了点赞和分享 结语 通过今天的学习您已经踏上了Golang的学习之旅。在未来的日子里您将探索Golang的各个方面从基础概念到高级技巧从实际应用到性能优化。 学习一门编程语言是一个持续的过程每一天都是您向Golang的精通迈进的重要一步。我鼓励您坚持每天学习保持热情和好奇心解决挑战并享受成功的喜悦。 在您的学习旅程中不要忘记参与社区和与其他Golang开发者交流。分享您的见解和经验向他人学习并在开源项目或实际应用中展示您的技能。 如果您在学习过程中遇到困难或有任何问题不要犹豫向社区和专家寻求帮助。持续学习勇敢探索您将在Golang领域取得令人瞩目的成就。 最后感谢您的阅读和支持祝愿您在未来的每一天中都能够成为一名精通Golang的开发者 期待听到您在学习过程中的进展和成就。如果您需要进一步的帮助请随时告诉我。祝您在学习Golang的旅程中取得巨大成功 点击下方名片加入IT技术核心学习团队。一起探索科技的未来共同成长。 如果您在学习过程中有任何疑惑请点击下方名片带您一对一快速入门 Go语言 的世界 ~
http://www.w-s-a.com/news/956450/

相关文章:

  • 长春服务好的网站建设百度推广话术全流程
  • 做的网站浏览的越多越挣钱基于jsp的网站开发开题报告
  • 好的做问卷调查的网站好网站调用时间
  • 广州微网站建设平台阿里云国外服务器
  • 如何把做好的网站代码变成网页wordpress shortcode土豆 视频
  • 网站改版竞品分析怎么做中山网站建设文化价格
  • 玉林市网站开发公司电话做网站空间 阿里云
  • 南充做网站略奥网络免费的正能量视频素材网站
  • 电子商务网站开发的基本原则汕头网站制作流程
  • 网站访问量突然增加合肥宣传片制作公司六维时空
  • 建设购物网站流程图怎么找网站
  • 阿里云部署多个网站制作小程序网站源码
  • 博罗东莞网站建设网站免费源代码
  • 网站规划与设计范文桂平网站建设
  • 网站备案号密码wordpress邮箱发送信息错误
  • 模板的网站都有哪些关键词搜索工具爱站网
  • 鲜花网站建设的利息分析企业网站建设方案书
  • 深圳网站平台石家庄做商城网站的公司
  • 微网站营销是什么私人订制网站有哪些
  • 浙江建设工程合同备案网站新手做网站教程
  • 网站优化关键词排名自己怎么做wordpress安装主题失败
  • 成都建设银行招聘网站网站的切换语言都是怎么做的
  • 网站网业设计wordpress 很差
  • 网站开发软件著作权归谁网站悬浮窗广告
  • 如何提升网站alexa排名货运网站源码
  • 如何看自己网站流量梧州网站设计理念
  • 商城网站建设特点有哪些信息门户
  • 弄一个网站临沂有哪几家做网站的
  • 广州个人网站制作公司网站建设公司价
  • 免费建设网站赚钱小程序开发文档pdf