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

匿名结构和空结构

毋炳
2023-03-14
问题内容

http://play.golang.org/p/vhaKi5uVmm

package main

import "fmt"

var battle = make(chan string)

func warrior(name string, done chan struct{}) {
    select {
    case opponent := <-battle:
        fmt.Printf("%s beat %s\n", name, opponent)
    case battle <- name:
        // I lost :-(
    }
    done <- struct{}{}
}

func main() {
    done := make(chan struct{})
    langs := []string{"Go", "C", "C++", "Java", "Perl", "Python"}
    for _, l := range langs { go warrior(l, done) }
    for _ = range langs { <-done }
}

[第一个问题]

 done <- struct{}{}

我们如何以及为什么需要这种看起来很奇怪的结构?它是空结构还是匿名结构?我用谷歌搜索,但是找不到正确的答案或说明文档。

原始资料来自Andrew Gerrand的演讲
http://nf.wh3rd.net/10things/#10

这里

 make(chan struct{})

完成是struct {}类型的通道

所以我尝试了

 done <- struct{}

但这是行不通的。为什么我需要为该行加一个括号?

 done <- struct{}{}

[第二个问题]

 for _ = range langs { <-done }

为什么我需要这条线?我知道这行是必要的,因为没有这行,就没有输出。但是,为什么这行呢?什么使该代码有必要?我知道这<-done是从已完成的通道接收值并丢弃接收到的值。但是,为什么我需要这样做?


问题答案:

复合文字

复合文字量为结构,数组,切片和映射构造值,并在每次对其求值时创建一个新值。它们由值的类型和紧随其后的复合元素列表组成。元素可以是单个表达式或键值对。

struct{}{}是type的复合文字,struct{}值的类型后跟大括号绑定的复合元素列表。

for _ = range langs { <-done }正在等待,直到所有goroutines langs已发送所有done消息。



 类似资料:
  • 10.5.1 定义 结构体可以包含一个或多个 匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型就是字段的名字。匿名字段本身可以是一个结构体类型,即 结构体可以包含内嵌结构体。 可以粗略地将这个和面向对象语言中的继承概念相比较,随后将会看到它被用来模拟类似继承的行为。Go 语言中的继承是通过内嵌或组合来实现的,所以可以说,在 Go 语言中,相比较于继承,组合更受青睐。

  • 问题内容: 我有一个json作为 我想将我的结构编组到json之上并创建如下结构- 我在初始化上述结构时遇到麻烦。我不确定如何以以下方式初始化匿名结构: 我通过为页面信息创建一个单独的结构并将其与父结构附加在一起来解决此问题。但是,必须有某种方法来执行 匿名 嵌套结构的初始化,就像我对上面的 Fields (字符串切片)所做的一样。谁能将我重定向到一些指南来做到这一点? 问题答案: 这可行,但是很

  • C标准规定: 指向结构对象的指针,经过适当的强制转换,指向其初始成员(如果该成员是位字段,则指向其所在的单元),反之亦然。 如果有问题的结构的第一个成员是匿名结构/联合,是否有任何可能(并且定义良好)的方法在C11中执行这种“合适的转换”?或者如果包含的结构是匿名的,则执行“反之亦然”的反向转换? 我猜想,转换为与匿名结构具有相同成员序列的非匿名结构会使它无法很好地定义,因为它们不兼容,因此不能保

  • 据我所知,命名空间std包含所有的C++标准库,其中一个标准库是iostream,它有对象cout和cin。 上面的结构正确吗?还是不同?

  • 问题内容: 我在检索Java中匿名PLSQL块的结果时遇到了一些麻烦。 这是块: 我把查询放在一个字符串中: 那字符串正确吗? 尝试检索的方法: 当我收到此消息时,它不起作用: 那我该如何找回呢? 问题答案: 这是因为 隐式 日期转换失败。添加而不是直接将日期字符串分配给日期变量。如果使用,则不需要。 隐式转换通常取决于会话的。 您的罪魁祸首。实际上将尝试转换为日期。因此引发了异常! 然后, 将设

  • 问题内容: 包: struct中的匿名接口是什么意思? 问题答案: 通过这种方式,反向实现了,我们可以覆盖特定的方法而不必定义所有其他方法 请注意,这里是如何交换而不是交换的,这也是为struct声明的唯一方法,即使实现 无论此方法内部传递了什么结构,我们都会将其转换为新的结构。 真正的价值在于,如果您认为如果无法采用这种方法,该怎么办。 向吗?添加另一种方法? 创建另一个ReverseInter