2015-01-26 58 views
0

我正在嘗試在GO中執行測試。但是我在結構中苦於列表的語法。GO中的測試列表

package primeFactor 

import "testing" 

var testCases = []struct { 
    p  int 
    expected []int 
}{ 
    {15, [3,5]}, 
    {26, [2,13]}, 
    {37, [37]}, 
    {42, [2,3,7]}, 
} 

func TestPrimeFactor(t *testing.T) { 
    for _, test := range testCases { 
     observed := PrimeFactor(test.p) 
     if observed != test.expected { 
      t.Error("For p = %d, expected %t. Got %t.", 
       test.p, test.expected, observed) 
     } 
    } 
} 

輸出錯誤我是:

expected ']', found ',' 
: expected operand, found '{' 
: expected ';', found 'for' 

我感謝你的幫助。謝謝。

回答

2

託尼的回答針對您的具體問題,但解決比較片的其他問題,您需要使用reflect.DeepEqual

看看這個例子:

package main 

import (
    "fmt" 
    "reflect" 
) 

func main() { 
    observed := []int{1, 2} 
    expected := []int{1, 3} 

    if reflect.DeepEqual(observed, expected) { 
     fmt.Println("Slices are the same") 
    } else { 
     fmt.Println("Slices are different") 
    } 
} 

https://play.golang.org/p/_JRQ5bqmJf

+1

完美。謝謝。 – 2015-01-26 21:25:21

3

你爲什麼首先寫這個?這不是Go語法。從the spec

切片文字描述整個底層陣列文字。因此,切片文字的長度和容量是最大元素索引加1。切片文字的形式

[]T{x1, x2, … xn} 

所以,你的情況:

var testCases = []struct { 
    p  int 
    expected []int 
}{ 
    {15, []int{3, 5}}, 
    {26, []int{2, 13}}, 
    {37, []int{37}}, 
    {42, []int{2, 3, 7}}, 
} 

該規範是非常可讀的,那麼可怕比人們想象的。您可能想要全面觀察並保持密切以供參考。

+0

注意到。謝謝。但似乎我需要比較一個元素。 「切片只能比to」 – 2015-01-26 20:51:25

1

...爲了完整起見,下面只是編寫自己的函數的一個簡單示例,您的測試可以調用它來比較切片:

func slicesMatch(a, b []int) bool { 
    la := len(a) 
    lb := len(b) 

    if la != lb { 
     return false 
    } 

    for i := 0; i < la; i++ { 
     if a[i] != b[i] { 
      return false 
     } 
    } 

    return true 
} 

View it on the Playground

+0

+1。我一直在努力學習Go幾個月,尤其對社區認爲「慣用」感興趣。對於這個簡單的用例,避免使用'reflect'包是否是典型的?或者你的文章只是「完整性」,正如你所說的那樣? – jcbwlkr 2015-01-26 21:30:42

+1

雖然在例子'reflect.DeepEqual'中有作用(並且在小切片下工作很快),切片越大,切片越慢。它通過各種各樣的箍環來返回結果,因爲它試圖確定切片中使用的類型以及如何比較它們。而你已經知道片的類型('int'),所以你可以根據自己的用例對自己的版本進行微調。有些人認爲這是個人喜好..但我認爲你會發現很多地鼠喜歡速度。 – 2015-01-26 21:35:57

+0

...如果你擔心它的「自定義書寫」方面,不要這樣 - 像這樣的效用函數會隨着時間的推移而增長。只需將它們放在自己的軟件包中,並在將來再次參考它,那個問題就會消失:) – 2015-01-26 21:37:57