2016-07-13 19 views
5

đang A:tại sao in lát bằng fmt.Println (slice) là khác nhau trong Golang

package main 

import "fmt" 

func main() { 
    slice := IntSlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 
    fmt.Println(slice) 
} 

type IntSlice []int 

đầu ra A:

[0 1 2 3 4 5 6 7 8 9] 

đang B:

package main 

import "fmt" 

func main() { 
    slice := IntSlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 
    fmt.Println(slice) 
} 

type IntSlice []int 

func (slice IntSlice) Error() string { return "this is called." } 

đầu ra B:

this is called. 

lý do hành vi của fmt.Println(slice) khác với hai mã này (A và B)?
hoặc lý do tự động fmt.Println(slice) gọi slice.Error()?

+0

Từ tài liệu Go: "4. Nếu toán hạng thực hiện giao diện lỗi, phương thức Lỗi sẽ được gọi để chuyển đối tượng thành chuỗi, sau đó sẽ được định dạng theo yêu cầu của động từ (nếu có)." – squiguy

Trả lời

7

Đây là documented như một phần của hành vi của fmt (tôi nhấn mạnh):

Trừ khi in bằng cách sử dụng động từ% T và% p, cân nhắc định dạng đặc biệt áp dụng cho toán hạng mà thực hiện giao diện nhất định. Theo thứ tự của ứng dụng:

  1. Nếu toán hạng được phản ánh.Value, toán hạng được thay thế bằng giá trị cụ thể mà nó giữ và in tiếp tục với quy tắc tiếp theo.

  2. Nếu toán hạng thực hiện giao diện Trình định dạng, nó sẽ được gọi. Trình định dạng cung cấp khả năng kiểm soát định dạng tốt.

  3. Nếu động từ% v được sử dụng với cờ # (% # v) và toán hạng thực hiện giao diện GoStringer, sẽ được gọi.

    Nếu định dạng (đó là ngầm% v cho println vv) có giá trị trong một chuỗi (% s% q% v% x% X), hai quy tắc sau đây được áp dụng:

  4. Nếu một toán hạng thực hiện giao diện lỗi, phương thức Error sẽ được gọi để chuyển đổi đối tượng thành một chuỗi, sau đó sẽ được định dạng theo yêu cầu của động từ (nếu có).

  5. Nếu toán hạng thực hiện phương thức String() string, phương thức đó sẽ được gọi để chuyển đối tượng thành chuỗi, sau đó sẽ được định dạng theo yêu cầu của động từ (nếu có).

Đối với các toán hạng ghép như các lát và cấu trúc, định dạng áp dụng cho toàn bộ toán hạng. Do đó,% q sẽ trích dẫn từng phần tử của một chuỗi các chuỗi và% 6.2f sẽ kiểm soát định dạng cho mỗi phần tử của một mảng dấu phẩy động.

Gói fmt thấy rằng slice thực hiện error và in value.Error(), chứ không phải là lặp qua một slice và áp dụng định dạng cho mỗi yếu tố.

Các vấn đề liên quan