登录
首页 >  Golang >  Go问答

任何人都可以理解 connStateInterface 吗?

来源:stackoverflow

时间:2024-04-05 22:12:39 103浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《任何人都可以理解 connStateInterface 吗?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

func (c *conn) setState(nc net.Conn, state ConnState) {
    ...
    c.curState.Store(connStateInterface[state])
    ...
}

// connStateInterface is an array of the interface{} versions of
// ConnState values, so we can use them in atomic.Values later without
// paying the cost of shoving their integers in an interface{}.
var connStateInterface = [...]interface{}{
    StateNew:      StateNew,
    StateActive:   StateActive,
    StateIdle:     StateIdle,
    StateHijacked: StateHijacked,
    StateClosed:   StateClosed,
}

我无法弄清楚 connstateinterface 的技巧,它究竟是如何工作的?


解决方案


这里发生了一些事情......

[...] 声明创建一个实际的数组而不是切片,因此间接性被删除。这里声明的是 interface{} 类型的数组...所以您可能想知道为什么会有奇怪的地图符号?

statexxx 变量只是上面声明的常量,因此它们是整数...因此声明实际上采用 index: value 的形式。

这是一个使用整数数组的不太模糊的示例:

var i = [...]int{4: 2, 2: 7}

这将分配一个包含以下内容的数组:

[0, 0, 7, 0, 2]

...请注意,索引 2 有 7,索引 4 有 2。这不是声明数组的常用方法,但它是有效的 go。

所以回到原来的声明,就拿我上面给出的例子来说,用 interface{} 类型的数组代替 int:

var i = [...]interface{}{4: 2, 2: 7}

您将得到一个类似的数组,但用 nil 接口值代替零。

更接近原始代码,statexxx 常量只是整数,只是不是像我的示例中那样的文字。

那么,这一切有什么意义呢?为什么这么混乱?

这是一个性能黑客。函数 c.curstate.store() 采用 interface{} 类型的参数。如果你要向它传递一个 int,编译后的代码将不得不在每次调用时摸索转换类型。对此的更清晰(尽管显然不切实际)的说明可能是:

var val interface{}

for i := 0; i < 1000000; i++ {
    // the types are different, compiler has to fumble int vs. interface{}
    val = i
    // do something with val
}

每次执行 val = i 时,都需要在 intinterface{} 之间进行转换。您发布的代码通过创建一个静态查找表来避免这种情况,其中所有值都已经是接口类型。

因此,这个:

c.curstate.store(connstateinterface[state])

比这更有效:

c.curState.Store(state)

由于 state 在这种情况下需要进行 int -> 接口{} 转换。在优化的代码中,state 只是在数组中查找值的索引,其结果为您提供 interface{}...因此避免了 int -> 接口{} 类型转换。

我不熟悉该代码,但我想它处于关键路径中,纳秒或任何节省的时间可能会产生影响。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>