小编Gre*_*ine的帖子

结构的映射与Go中的结构数组

假设我有一个带字符串属性b的简单结构a:

type A struct {
    B string
}
Run Code Online (Sandbox Code Playgroud)

以下代码使用A类型的数组:

testArray := []A{A{}}
testArray[0].B = "test1"
fmt.Println(testArray[0].B)
Run Code Online (Sandbox Code Playgroud)

将按预期打印出"test1".

但是这段代码似乎同样简单:

testMap := make(map[string]A)
testMap["key"] = A{}
testMap["key"].B = "test2"
fmt.Println(testMap["key"].B)
Run Code Online (Sandbox Code Playgroud)

不会打印出"test2",而是会导致以下错误:

无法分配到testMap ["key"].B

那么,为什么分配给映射中的子属性会导致错误,同时分配给数组中的子属性按预期工作?我想知道为什么这对地图不起作用以及为什么它对数组起作用.我也很想知道他们为什么设计这两种数据结构之间存在差异的语言.

struct map go slice

6
推荐指数
2
解决办法
4983
查看次数

在 Scala 的构造函数中扩展具有隐式参数的类的惯用方法是什么?

我正在扩展一个抽象类,它在其构造函数中定义了一个隐式参数。

似乎有 3 种不同的方法可以做到这一点:

abstract class Base(z: ZType)(implicit a: AType)

// Explicit
class First(z: ZType, a: Atype) extends Base(z)(a)

// Explicitly pass a into the child class which
// implicitly passes it into the parent class
class Second(z: ZType, implicit val a: AType) extends Base(z)

// Implicitly passed into both
class Third(z: ZType)(implicit a: AType) extends Base(z)
Run Code Online (Sandbox Code Playgroud)

也许这取决于将如何使用子类。就我而言,子类不会有隐含AType的作用域,所以我倾向于第二种选择。

我对第二个选项最大的担忧是,我现在为同一类型定义了 2 个隐式,一个在父类中,一个在子类中。由于它们始终是同一个对象,这有什么影响吗?出于任何原因,我应该避免第二种模式吗?

基本上,这里是否有“正确”的模式,或者所有这些都可以接受,具体取决于它们所使用的代码的上下文?

scala implicit

5
推荐指数
1
解决办法
184
查看次数

在Scala中进行一系列flatMaps的惯用方法是什么?

我知道,将yield转换为一系列flatMaps,然后是最终地图.我发现自己经常希望它在最终的flatMap中结束.到目前为止,我的解决方法是进行收益率,然后进行平仓,如下所示:

val aOpt = Some("a")
val bOpt = Some("b")
def fakeComplexFunc(s1: String, s2: String): Option[String] = Some(s1 + s2)
(for {
    a <- aOpt
    b <- bOpt
} yield {
    // Pretend this is a long block with lots of stuff in it
    fakeComplexFunc(a, b)
}).flatten
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?对于像这样的案件,有什么最佳做法吗?如果我最终陷入这种境地,我是否做了一些彻底错误的事情?

scala

0
推荐指数
1
解决办法
84
查看次数

标签 统计

scala ×2

go ×1

implicit ×1

map ×1

slice ×1

struct ×1