在函数内部还是外部定义结构的含义?

Are there any implications (GC churn, performance, or otherwise) to defining an struct inside a function vs. having it defined outside? For example:

type Outside struct {
  Foo string `json:"foo"`
}

func SomeFunc(b []byte) error {
  outside := Outside{}

  if err := json.NewDecoder(b).Decode(&outside); err != nil {
    return err
  }

  ...
}

vs.

func SomeFunc(b []byte) error {

  type inside struct {
    Foo string `json:"foo"`
  }

  if err := json.NewDecoder(b).Decode(&inside); err != nil {
    return err
  }

  ...
}

Would there be any situations where one is preferred over the other?

My understanding is the difference is just in accessibility. A struct defined starting with an upper case letter will be exportable, meaning it can be accessed from other packages. A struct defined starting with a lower case letter can be accessed from anything within the same package but not externally. A struct defined in a function in line can only be accessed/initialized by that function.

There is no performance difference – it's only a difference of scope (i.e., where the type definition can be seen). If you only need the type within a single function, it's fine to define it there.

As others have noted, if you define a type at the package level (i.e., outside of a function) with a name beginning with a capital letter, it will be exported (i.e., visible outside the package). If the name doesn't begin with a capital letter, it will only be visible within the package.

To me the main drawback for a type defined in a function is that you cannot define methods on that type.

See this example https://play.golang.org/p/cgH01cRwDv6:

package main

import (
    "fmt"
)

func main() {
    type MyType struct {
        Name string
    }

    // You cannot define a method on your type
    // defined in a function, can you?

    func (m MyType) String() string {
      return m.Name
    }

    m := MyType{Name: "Hello, World!"}
    fmt.Println(m)
}

The above example will fail with the error prog.go:15:27: expected ';', found 'IDENT' string (and 1 more errors).

For me I once defined a struct inside a function for marshalling json []byte into the struct instance and extract a message from the instance.

Obviously it is not required to define the struct. I could have extracted the message by marshalling the json byte array into interface{} and then cast recursively to get the required message.

By defining the struct, extraction of the message becomes very easy :)

    var errDetail struct {
        Message string `json:"message"`
        Success bool   `json:"success"`
    }

    json.Unmarshal(*bytes, &errDetail)

    if errDetail.Message == "" {
        fmt.Println("error message is not present")
        return nil
    }
    return errDetail.Message