2015-10-22 10 views
5

Các mẫu có một số kết quả không mong muốn khi sử dụng eq với index cho tôi. Xem mã này:Tìm các mẫu có chỉ số và chỉ số

package main 

import (
    "os" 
    "text/template" 
) 

func main() { 
    const myTemplate = ` 
{{range $n := .}} 
    {{index $n 0}} {{if (index $n 0) eq (index $n 1)}}={{else}}!={{end}} {{index $n 1}} 
{{end}} 
` 
    t := template.Must(template.New("").Parse(myTemplate)) 

    t.Execute(os.Stdout, 
     [][2]int{ 
      [2]int{1, 2}, 
      [2]int{2, 2}, 
      [2]int{4, 2}, 
     }) 

} 

tôi mong đợi để có đầu ra

1 != 2 
2 = 2 
4 != 2 

nhưng tôi nhận

1 = 2 
2 = 2 
4 = 2 

tôi nên thay đổi gì để có thể so sánh thành viên mảng trong mẫu đi?

Trả lời

3

Bạn sử dụng toán tử sai và thứ tự đối số. Trước tiên bạn phải viết các nhà điều hành và sau đó là toán hạng:

{{if eq (index $n 0) (index $n 1)}} 

Đây là dễ đọc hơn và tiện dụng như eq có thể mất nhiều hơn là chỉ 2 đối số, vì vậy bạn có thể viết ví dụ:

{{if eq (index $n 0) (index $n 1) (index $n 2)}} 

Để kiểm tra bình đẳng đa chiều đơn giản hơn, eq (chỉ) chấp nhận hai hoặc nhiều đối số và so sánh số thứ hai và sau đó đối số đầu tiên, trả về hiệu lực

arg1==arg2 || arg1==arg3 || arg1==arg4 ... 

(Không giống với || tại Gò Tuy nhiên, eq là một cuộc gọi chức năng và tất cả các đối số sẽ được đánh giá)

Với sự thay đổi này đầu ra (thử nó trên Go Playground):.

1 != 2 

2 = 2 

4 != 2 

Lưu ý:

Bạn không bắt buộc phải giới thiệu biến "vòng lặp", hành động {{range}} thay đổi dấu chấm thành mục hiện tại:

... chấm được thiết lập với các yếu tố liên tiếp của mảng, miếng, hoặc bản đồ ...

Vì vậy, bạn có thể đơn giản hóa mẫu của bạn, đây là tương đương như của bạn:

{{range .}} 
    {{index . 0}} {{if eq (index . 0) (index . 1)}}={{else}}!={{end}} {{index . 1}} 
{{end}} 

Cũng lưu ý rằng bạn có thể tự tạo biến trong mẫu, được khuyến nghị nếu bạn sử dụng cùng một biểu thức nhiều lần không cần thiết (chẳng hạn như index . 0).Đây cũng là tương đương với mẫu của bạn:

{{range .}}{{$0 := index . 0}}{{$1 := index . 1}} 
    {{$0}} {{if eq $0 $1}}={{else}}!={{end}} {{$1}} 
{{end}} 

Cũng lưu ý rằng trong trường hợp cụ thể này kể từ khi những điều bạn muốn đầu ra trong ifelse chi nhánh cả chứa dấu =, bạn không cần phải 2 chi nhánh, = cần được xuất ra trong cả hai trường hợp, bạn chỉ cần thêm một dấu hiệu ! nếu chúng không bằng nhau. Vì vậy, mẫu cuối cùng sau cũng tương đương với mẫu của bạn:

{{range .}}{{$0 := index . 0}}{{$1 := index . 1}} 
    {{$0}} {{if ne $0 $1}}!{{end}}= {{$1}} 
{{end}} 
Các vấn đề liên quan