2014-04-06 53 views
1
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) 
} 

這個問題是找到了我,什麼是判斷它是否是包的名稱或對象名稱,如上面的代碼形式出現,主要的最快方法func,fmt被稱爲包名,因爲每個人都知道。但是當涉及到xxx.Println()時,如何知道它是包名還是對象名,假定主函數包含許多代碼行,並且很難指出對象「xxx」的聲明,並且導入了很多包,並且很難搜索import()的每一行以查看包中是否列出了「xxx」,怎麼辦你告訴xxx是什麼?如何在golang包名稱和對象名稱之間distingish

和func Println一樣,你只是直接轉向yyy.Print(3),func聲明中的接收器很難找到,因爲它在屏幕之外,你怎麼知道yyy是最快的方法,yyy可以是包名稱和接收者名稱。

如果沒有這樣簡單的方法,是否意味着我應該總是先搜索import()列出的包,然後將屏幕滾動到func聲明的最開始處以查找接收者名稱,以及那麼我可以知道它是什麼?這聽起來需要太多時間!

回答

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

2

對於第二個問題(yyy.Println()內法Println()),我認爲這是標準的圍棋風格很短的名字來命名的接收器。因此,標準的圍棋風格建議:

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

至於第一個問題......我不知道,如果你在談論你的代碼,或別人的代碼。我會說,你最終會了解給定程序或庫使用的模塊是非常標準的。 (真的很短的變量名稱,然後camelCase變量名稱也有幫助。)