当前位置: 首页 > 面试题库 >

golang多种类型的开关

梅耘豪
2023-03-14
问题内容

当我运行下面的代码片段时,它会引发错误

a.test未定义(类型interface {}是没有方法的接口)

看来类型开关没有生效。

package main

import (
    "fmt"
)

type A struct {
    a int
}

func(this *A) test(){
    fmt.Println(this)
}

type B struct {
    A
}

func main() {
    var foo interface{}
    foo = A{}
    switch a := foo.(type){
        case B, A:
            a.test()
    }
}

如果我将其更改为

    switch a := foo.(type){
        case A:
            a.test()
    }

没关系


问题答案:

这是规范(强调我的)定义的正常行为:

TypeSwitchGuard可以包含一个简短的变量声明。使用该格式时,将在每个子句中隐式块的开头声明变量。
在大小写正好列出一种类型的子句中,变量具有该类型。 否则,变量具有TypeSwitchGuard中表达式的类型

因此,实际上,类型开关确实有效,但是变量a保留type interface{}

你能解决这个问题的方法之一是断言的是foo有方法test(),这将是这个样子:

package main

import (
    "fmt"
)

type A struct {
    a int
}

func (this *A) test() {
    fmt.Println(this)
}

type B struct {
    A
}

type tester interface {
    test()
}

func main() {
    var foo interface{}
    foo = &B{}
    if a, ok := foo.(tester); ok {
        fmt.Println("foo has test() method")
        a.test()
    }
}


 类似资料:
  • 问题内容: 我有一个XML文档。一些字段具有自定义格式。例: 我想将其导入如下结构: 有什么方法可以实现自定义解码器,它将行字符串拆分成行数组()? 可以将Lines字段设置为字符串类型,并在xml导入后进行拆分,但这似乎不是一个很好的解决方案。我有什么方法可以定义用于行分割的自定义解码器,并将其与xml解码器组合? 问题答案: 您可以通过定义符合接口的新类型来实现。因此,与其创建一个,而不是使用

  • 我想从我的api发送一个响应,所有响应都有一个统一的结构 我希望数据能够成为不同的结构,而不仅仅是单个数据结构。我可以说我没有正确使用这种模式。完成这种事情的正确方法是什么?有没有办法让结构字段能够成为具有相同键的任何类型?

  • 问题内容: 我尝试解析返回json对象的api。我的问题是,在以下示例中,某些键有时是字符串,有时是类似“ Value”键的对象: 我的结构看起来像这样: 我必须告诉我我完全迷路了(是的,我是个迅速的初学者),我找不到解决我问题的方法。我知道我必须使用自定义init,但我不知道如何。 问题答案: 你可以试试

  • 通用类可以具有多个类型参数。 以下示例将展示上述概念。 例子 (Example) 使用您选择的任何编辑器创建以下Java程序。 GenericsTester.java package com.wenjiangs; public class GenericsTester { public static void main(String[] args) { Box<Integer,

  • 问题内容: 我是Go语言的初学者。我可能认为多年以来其他语言都太传统了,但这就是我想在Go中做的事情。假设以下用例 我有接口I。此接口具有功能start()和stop() 有许多实现接口的结构。结构A,结构B,结构C 当应用程序启动时,我想在结构A,B和C上调用start() 同样,当应用程序终止时,我想在A,B,C结构上调用stop()。 我不想在代码中的任何地方硬编码结构A,B和C来调用启动/

  • 本文向大家介绍Golang中的int类型和uint类型到底有多大?,包括了Golang中的int类型和uint类型到底有多大?的使用技巧和注意事项,需要的朋友参考一下 在开始之前,我们先来看看uint 与 int 的区别 上面是图,下面是源码: 引言 今天调试一个问题,发现一个我无法理解的情况: 把64位的数字赋值给uint,我理解uint是32位的,为啥可以编译通过?但是我接着又在 playgr