【问题标题】:How to distingish between package name and object name in golanggolang中如何区分包名和对象名
【发布时间】:2014-04-07 01:12:17
【问题描述】:
package main
import (
......
"fmt"
......
)

func main() {
        ......
    xxx:=new(xxx)
    fmt.Println("1")
        ......
    xxx.Println()//confusing

}
type xxx struct{
    one int
    two string
}
func (yyy *xxx) Println(){
    fmt.Println("2")
    yyy.Print(3)//confusing too
}
func (this *xxx) Print(a int){
    fmt.Println(a)
}

这个问题一直困扰着我,什么是最快的方法来判断它是包名还是对象名,如上面的代码,在 main func 中,fmt 被称为包名,因为每个人都知道。但是说到xxx.Println(),你怎么知道它是包名还是对象名,假设main函数包含很多行代码,并且很难确定对象“xxx”的声明,而且,导入的包很多,你很难搜索import()的每一行,看看包中是否列出了“xxx”,你怎么知道xxx是什么?

和func Println一样,直接上yyy.Print(3),func声明中的receiver很难找到,因为它不在屏幕上,你怎么知道yyy是最快的方式, yyy 可以是包名和接收者名。

如果没有这样更简单的方法,这是否意味着我应该总是先搜索 import() 列出的包,然后将屏幕滚动到 func 声明的最开头以查找接收者名称,然后我可以知道它是什么?这听起来太花时间了!

【问题讨论】:

  • 这是一个有效的问题,包/变量+点分语法令人困惑,它可以是方法调用或来自包的函数调用。它使阅读代码变得困难。您必须注意这两种不同的解释。

标签: function go package


【解决方案1】:

对于第二个问题(yyy.Println() inside method Println()),我认为用非常短的名称命名接收器是标准的 Go 风格。因此,标准的 Go 风格建议:

func (x *xxx) Println() {
    fmt.Println(2)
    x.Print(3)
}

至于第一个问题……我不确定您是在谈论您的代码,还是其他人的代码。我想说的是,您最终会了解给定程序或库正在使用哪些模块,这是非常标准的。 (真的很短的变量名,然后驼峰式变量名也有帮助。)

【讨论】:

    【解决方案2】:

    使用短期记忆,快速扫描源代码的显着特征。

    package main
    
    import (
        // ......
        "fmt"
        // ......
    )
    
    type xxx struct {
        one int
        two string
    }
    
    func (this *xxx) Print(a int) {
        fmt.Println(a)
    }
    
    func (yyy *xxx) Println() {
        fmt.Println("2")
        yyy.Print(3) // yyy is receiver *xxx
    }
    
    func main() {
        // ......
        xxx := new(xxx)
        fmt.Println("1")
        // ......
        xxx.Println() // xxx is var xxx
    }
    

    应用语言规则。例如,块和范围规则。

    通过练习,这很容易。

    参考资料:

    The Go Programming Language Specification

    Import declarations

    Qualified identifiers

    Selectors

    Blocks

    Declarations and scope

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 2023-02-03
      • 2012-02-17
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      相关资源
      最近更新 更多