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声明的最开头,找到接收者名称,然后我知道它是什么?这听起来花了太多时间!
答案 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
}
应用语言规则。例如,块和范围规则。
通过练习,很容易。
参考文献: