4 ms·
Can anyone explain what’s happening here? I can’t make sense of the syntax: func (q Query) GroupBy(field string) Query {...}
by MrBuddyCasino 8y ago
Can anyone explain what’s happening here? I can’t make sense of the syntax:
func (q Query) GroupBy(field string) Query {...}
- masklinn 8y agoThat's how you define a method in Go. The local to the left of the function name is the receiver (what `this` would be in Java). Note that there are a few odd bits to Go methods: the receiver can be a value or a pointer, and if the receiver is a pointer it might be null, because method calls on concrete types are statically dispatched so type S struct{} func (self *S) Foo() { fmt.Printf("%v\n", self) } func main() { var s *S s.Foo() } will print "<nil>".
- dewey 8y agoQuery is the type. So it's a function that works on the type Query, takes an input parameter of type string and returns a struct of type Query.
- Noumenon72 8y agoWhy is it "q Query"?
- ovao 8y agoIn Go, the type follows the identifier. To use a single letter or short sequence of letters is idiomatic Go for short-lived identifiers or ‘quintessential’ identifiers.
- bbbobbb 8y agoThat the "receiver" identifier. You can think of it as "this" or "self" in other languages -> reference to the current "instance" within the method. https://gobyexample.com/methods https://gobyexample.com/methods
- dewey 8y agoq of type Query. So in the function you can access the fields on q (Where you call the function on) via q.FieldName. If you do it with a pointer receiver (q *Query) like explained here (https://tour.golang.org/methods/4 https://tour.golang.org/methods/4) you can directly manipulate the object, not the copy like in this example.
- pram 8y agoGroupBy is a method on Query, and it returns Query so the methods can be chained.
- notafrog 8y agoI like the Go language for all of its efficiency and easy concurrency, but part of me can't help but think that they were dying to make some new syntax just for the sake of it.
- pjmlp 8y agoThat syntax was based on Oberon-2 (1991), given Robert Griesemer's presence on the team. PROCEDURE (q : Query) GroupBy*(field: String): Query; BEGIN (* .... *) END GroupBy;