It would probably be useful, but to be fair, I rarely had this problem
aside from sort. I think this mechanism is better suited for the occasional
edge-case (as it doesn't require a language change):
https://github.com/golang/go/issues/4146

On Fri, Aug 19, 2016 at 8:49 PM, Joshua Liebow-Feeser <he...@joshlf.com>
wrote:

> Does it really make sense to create an internal package just to define a
> single small, one-off type? Also, I don't imagine that any of the
> optimizations would need to be reconsidered; the scope is strictly a subset
> of the scope at which the optimizations operated before, so there shouldn't
> be any *new* optimizations that need to be made here.
>
> On Fri, Aug 19, 2016 at 11:46 AM, Paul Jolly <p...@myitcv.org.uk> wrote:
>
>> I did indeed mean to reply to all (done that this time)!
>>
>> Sure, I understand that it's "cleaner", but I'm advocating the internal
>> package approach because:
>>
>>    - it solves the problem today
>>    - it benefits from being able to take advantage of existing compile
>>    time optimisations without needing those same optimisations to be
>>    reconsidered in a world where such method sets can be defined within a
>>    scope other than the package scope
>>
>> But if you raised this point here in order to propose a language change,
>> I'll quietly slip into the shadows!
>>
>>
>> Paul
>>
>>
>> On 19 August 2016 at 19:38, Joshua Liebow-Feeser <he...@joshlf.com>
>> wrote:
>>
>>> Hi Paul,
>>>
>>> I think you meant to reply-all to the mailing list as well; this was
>>> just sent to me :)
>>>
>>> My point is not about whether a type is exporter or not, but whether you
>>> can define it inside a function or not. Consider the following two
>>> implementations. This one <https://play.golang.org/p/fVfcSZPspO> is
>>> valid Go today, but involves declaring the 'sortableInts' type at the
>>> top-level, which in a complex file with a lot of code, can clutter things
>>> up a lot.  This one <https://play.golang.org/p/mvHJOj9htp> is not valid
>>> Go, but is much cleaner - everything is contained within the function.
>>>
>>> Cheers,
>>> Josh
>>>
>>> On Fri, Aug 19, 2016 at 11:31 AM, Paul Jolly <p...@myitcv.org.uk> wrote:
>>>
>>>> Hi Josh,
>>>>
>>>> I think those are interesting ideas, but my concern about scope-local
>>>>> methods extends beyond just the methods of the sort.Interface interface; I
>>>>> was just using that as an example. The same complaint applies for any type
>>>>> used only within a given scope that needs to implement any interface.
>>>>>
>>>>
>>>> But internal packages cover this case too, no? Apologies if I'm missing
>>>> a more fundamental point you're making.
>>>>
>>>> Considering the case of go/ast.Visitor
>>>>
>>>> https://godoc.org/go/ast#Visitor
>>>>
>>>> An unexported type implementing this interface could be kept within an
>>>> internal package, e.g. mydomain.com/banana/internal/typefinder, and an
>>>> exported function used to access this behaviour
>>>>
>>>> // mydomain.com/banana/internal/typefinder.go
>>>> package typefinder
>>>>
>>>> import (
>>>> "go/ast"
>>>> )
>>>>
>>>> type impl struct {
>>>> nameToMatch string
>>>> idents      []*ast.Ident
>>>> }
>>>>
>>>> func (i *impl) Visit(node ast.Node) ast.Visitor {
>>>> switch node := node.(type) {
>>>> case *ast.Ident:
>>>> if node.Name == i.nameToMatch {
>>>> i.idents = append(i.idents, node)
>>>> }
>>>> }
>>>> return i
>>>> }
>>>>
>>>> func GetMatches(name string, node ast.Node) []*ast.Ident {
>>>> walker := &impl{
>>>> nameToMatch: name,
>>>> }
>>>>
>>>> ast.Walk(walker, node)
>>>>
>>>> return walker.idents
>>>> }
>>>>
>>>>
>>>> And used from mydomain.com/banana as follows:
>>>>
>>>>
>>>> // mydomain.com/banana.go
>>>> package banana
>>>>
>>>> import (
>>>> "mydomain.com/banana/internal/typefinder"
>>>> "go/ast"
>>>> )
>>>>
>>>> func myFunc() {
>>>> var file *ast.File
>>>>
>>>> matches := typefinder.GetMatches("example", file)
>>>>
>>>> }
>>>>
>>>> The "issue" with this pattern is that you quickly arrive in a position
>>>> where you have an internal package per helper type... maybe that's not a
>>>> problem in and of itself however.
>>>>
>>>> Again, apologies if I missed your point.
>>>>
>>>
>>>
>> --
>> You received this message because you are subscribed to a topic in the
>> Google Groups "golang-nuts" group.
>> To unsubscribe from this topic, visit https://groups.google.com/d/to
>> pic/golang-nuts/ON-NFyhy23A/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to
>> golang-nuts+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to