2016-03-14 19 views
10

Có rất nhiều trường hợp sử dụng nil trong golang, như thế này:Nil có nghĩa là gì trong golang?

func (u *URL) Parse(ref string) (*URL, error) { 
    refurl, err := Parse(ref) 
    if err != nil { 
     return nil, err 
    } 
    return u.ResolveReference(refurl), nil 
} 

nhưng chúng ta không thể sử dụng nó như thế này:

var str string //or var str int 
str = nil 

trình biên dịch golang sẽ ném ra một lỗi can't use nil as type string in assignment.

Có vẻ như chỉ nil chỉ có thể được sử dụng cho con trỏ của cấu trúc và giao diện, sau đó có nghĩa là gì?khi chúng tôi sử dụng nó để so sánh với đối tượng khác, cách chúng so sánh, điều đó có nghĩa là golang đánh giá một đối tượng là nil?

CHỈNH SỬA: Ví dụ: nếu một giao diện là không, thì loại và giá trị của nó phải bằng 0 cùng một lúc. Làm thế nào golang làm cho nó?

+4

Bạn sẽ phải hiểu các loại Go và các giá trị khác nhau mà một đối tượng của mỗi loại có thể có. Tất cả các chi tiết về những thứ là nil, có thể gán cho nil, có thể so sánh được với nil và do đó một giải thích được giải thích trong https://golang.org/ref/spec đủ ngắn để đọc một lần và đủ rõ ràng để hiểu nó. – Volker

+0

Chuỗi trống trong Go là "".Để kiểm tra xem chuỗi có giá trị hay không, chỉ cần thực hiện 'str ==" "' – LibertyLocked

Trả lời

30

Trong Go, nil là giá trị zero cho con trỏ, giao diện, bản đồ, lát, các kênh truyền hình và các loại chức năng, đại diện cho một giá trị chưa được khởi tạo .

nil không có nghĩa là một số trạng thái "chưa được xác định", đó là giá trị thích hợp. Một đối tượng trong Go là nil chỉ đơn giản là nếu và chỉ khi giá trị của nó là nil, thì nó chỉ có thể là một trong các loại được đề cập ở trên.

An error là một giao diện, vì vậy nil là giá trị hợp lệ cho một, không giống như đối với string. Vì lý do hiển nhiên, lỗi nil đại diện cho không có lỗi.

1

nil trong Go chỉ đơn giản là giá trị con trỏ NULL của các ngôn ngữ khác.

Bạn có thể sử dụng hiệu quả nó thay cho bất kỳ con trỏ hoặc giao diện nào (giao diện có phần là con trỏ).

Bạn có thể sử dụng nó làm lỗi vì error type is an interface.

Bạn không thể sử dụng nó làm chuỗi vì trong Go, chuỗi là một giá trị.

nil là untyped tại Gò, có nghĩa là bạn không thể làm điều đó:

var n = nil 

Bởi vì ở đây bạn thiếu một kiểu cho n. Tuy nhiên, bạn có thể làm

var n *Foo = nil 

Lưu ý rằng nil là giá trị zero của con trỏ và giao diện, con trỏ chưa được khởi tạo và giao diện sẽ nil.

+0

Sai: 'nil' không có loại. Nó không được đánh máy. Bạn không thể làm: 'var n = nil' không phải vì nil có một kiểu, bởi vì, trình biên dịch không thể lấy được cái gì sẽ là kiểu' n', nó không thể trì hoãn kiểu, bởi vì, 'nil 'không có loại. –

+0

Cảm ơn bạn đã chỉ ra lỗi đánh máy, quá lâu sau câu trả lời. Chỉnh sửa sẽ có nhiều hơn _a proposal_. Nhưng cảm ơn dù sao đi nữa. – Elwinar

+0

Phải, không sao cả. –