首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >回答两个被频繁问到的代码写法问题

回答两个被频繁问到的代码写法问题

作者头像
新亮
发布2021-09-08 16:14:41
发布2021-09-08 16:14:41
2960
举报
文章被收录于专栏:新亮笔记新亮笔记

文章目录:

  • 前言
  • 问题一
  • 问题二
  • 小结
  • 推荐阅读

前言

根据使用者的反馈,回答关于开源项目:go-gin-api[1] 中被频繁问到的两个代码写法问题。

以如下代码片段为例:

  1. 第 8 行,这种写法是什么意思?
  2. 第 11 行,为什么定义一个 i() 方法?

问题一

代码语言:javascript
复制
var _ Signature = (*signature)(nil)

这代码是什么意思?

强制 *signature 去实现 Signature 接口,编译器会检查 *signature 类型是否实现了 Signature 接口。

来看一个例子:

代码语言:javascript
复制
package main

import "fmt"

var _ Study = (*study)(nil)

type study struct {
 Name string
}

type Study interface {
 Listen(message string) string
}

func main() {
 fmt.Println("hello world")
}

上面代码会输出 hello world 吗?

不会!

这时会输出:

代码语言:javascript
复制
./main.go:5:5: cannot use (*study)(nil) (type *study) as type Study in assignment:
 *study does not implement Study (missing Listen method)

如果去掉这一行:

代码语言:javascript
复制
var _ Study = (*study)(nil)

这时就可以输出 hello world 了。

问题二

代码语言:javascript
复制
i()

为什么在接口中定义一个 i() 方法?

强制 Signature 接口中所有方法只能在本包中去实现,在其他包中不允许去实现。因为接口中有小写方法,所以在其他包无法去实现。i() 表示一个小写方法,起其他名字也可以。

来看一个例子:

代码语言:javascript
复制
package study

type Study interface {
 Listen(message string) string
 i()
}

func Speak(s Study) string {
 return s.Listen("abc")
}

定义了一个 Study 接口,接口中包含两个方法,其中就有一个 i() 。

定义了一个 Speak 方法,入参是 Study 接口,方法体是执行接口中的 Listen 方法。

接下来看另一个文件:

代码语言:javascript
复制
type stu struct {
 Name string
}

func (s *stu) Listen(message string) string {
 return s.Name + " 听 " + message
}

func (s *stu) i() {}

func main() {
 message := study.Speak(new(stu))
 fmt.Println(message)
}

定义了一个 stu 结构体,这个结构体实现了 Study 接口中的方法,那么上述程序会正常输出吗?

不会!

这时会输出:

代码语言:javascript
复制
./main.go:19:28: cannot use new(stu) (type *stu) as type study.Study in argument to study.Speak:
 *stu does not implement study.Study (missing study.i method)
  have i()
  want study.i()

如果去掉接口中 i(),会正常输出:听 abc

小结

以上两个是读者在学习代码的过程中最常问的问题,希望这次能够帮大家解惑。

另外 option 设计模式,问的也不少,大家可以看下这篇文章:《函数的不定参数你是这样用吗?

推荐阅读

参考资料

[1]

go-gin-api: https://github.com/xinliangnote/go-gin-api

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 新亮笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 问题一
  • 问题二
  • 小结
  • 推荐阅读
    • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档