9

I see the following statements from camlistore(http://code.google.com/p/camlistore/source/browse/pkg/cacher/cacher.go).

var (
        _ blobref.StreamingFetcher = (*CachingFetcher)(nil)
        _ blobref.SeekFetcher      = (*CachingFetcher)(nil)
        _ blobref.StreamingFetcher = (*DiskCache)(nil)
        _ blobref.SeekFetcher      = (*DiskCache)(nil)
)

I understand that no variables are created and the statements ensure compiler checks that CachingFether implements public functions of StreamingFetcher and SeekFetcher. RHS portion uses a pointer constructor syntax with a nil parameter. What does this syntax mean in Go language ?

zzzz
  • 87,403
  • 16
  • 175
  • 139
satish
  • 329
  • 2
  • 11
  • I'm curious as to why that check is necessary. It seems to me that if they ever actually /used/ those values, the compiler would do the check? The only explanation I can think of is that they use the `unsafe` package, and they are going to do non-checked operations that they want the compiler to check anyway. But they don't import `unsafe` in that file. Any ideas? – joshlf Aug 01 '13 at 15:03
  • It's a static (compile time) check if the RHS type satisfies the LHS interface. With such check an accidental change to the RHS method set is immediately rejected by the compiler. – zzzz Aug 01 '13 at 17:43

1 Answers1

18

(*T)(nil) is a Conversion. In this case it stands for a typed nil, ie. the same value which, for example

var p *T

has before assigning anything to it.

The standard syntax of a conversion is T(expr), but the priority of the * would bind it wrongly in

*T(expr)

This syntax means dereferencing the return value of function T with one argument expr. That's why the conversion has an alternative syntax:

(T)(expr)

where T can of course be *U. Therefore

(*U)(expr)

is the generalized form of what you see in the Camlistore repository.

zzzz
  • 87,403
  • 16
  • 175
  • 139