匿名结构体添加方法的问题

guoapeng · 2019-10-01 21:02:33 · 1043 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2019-10-01 21:02:33 的文章,其中的信息可能已经有所发展或是发生改变。

开发中遇到一个问题,在如下代码中, 35 到 41 行的位置switch语句的default分支(Point A), 本意是用匿名结构体实现接口, 匿名结构体的作用就是返回resource not found 反馈给调用者, 但是发现在代码中很难给一个匿名结构体添加一个方法并使其符合某个接口. 我知道将返回类型改写为函数类型而不是接口类型, 可以解决遇到的问题.  

但是我发这个篇文章的目的是想探讨一下, 如何给一个匿名结构体添加方法,并让它符合某个接口

以下是编译器在代码 第35行(Pinter A) 给出的提示信息 Cannot use 'struct { handle func(w http.ResponseWriter, d []byte, r http.Request, id string) }{ func(w http.ResponseWriter, d []byte, r http.Request, id string){ http.NotFound(w, r) }, }' (type struct {...}) as type MediaHandler in assignment Type does not implement 'MediaHandler' as 'handle' method is missing l

package captcha

import (
    "bytes"
    "io"
    "net/http"
    "path"
    "strings"
    "time"
)


type MediaHandler interface {
    handle(w http.ResponseWriter, d []byte, r *http.Request, id string)
}

type captchaHandler struct {
    imgWidth  int
    imgHeight int
}

func (h *captchaHandler) createMediaHandler( r *http.Request) MediaHandler {
    dir, file := path.Split(r.URL.Path)
    ext := path.Ext(file)
    lang := strings.ToLower(r.FormValue("lang"))
    download := path.Base(dir) == "download"
    var mediaHandler MediaHandler
    switch ext {
    case ".png":
        mediaHandler = &ImgHandler{h.imgWidth, h.imgHeight, download}
    case ".wav":
        mediaHandler = &AudioHandler{lang, download}
    default:

        mediaHandler = struct {   //Point A: compile error , struct can't be assigned to mediaHandler 
            handle func(w http.ResponseWriter, d []byte, r *http.Request, id string)
        }{
            func(w http.ResponseWriter, d []byte, r *http.Request, id string){
                http.NotFound(w, r)
            },
        }
    }
    return mediaHandler
}

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1043 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传