如何在golang中区分包名和对象名

时间:2014-04-06 05:57:27

标签: function go package

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)
}

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

与func Println相同,你只是直接前往yyy.Print(3),func声明中的接收器很难找到,因为它不在屏幕上,你怎么会告诉yyy是最快的方式, yyy可以是包名和接收者名。

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

2 个答案:

答案 0 :(得分:2)

对于第二个问题(方法yyy.Println()内部Println()),我认为标准的Go风格是用非常短的名字命名你的接收器。所以,标准的Go风格会暗示:

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

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

答案 1 :(得分:1)

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

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