Thanks for the quick reply. Let's say I wanted to pass "fileinfo" from my program to another function. What would I say in function's argument list for fileinfo's type? From your reply I'm guessing I would give "fileinfo *io/fs.fileinfo" but I'm not sure.
Jon On Sunday, March 6, 2022 at 12:23:41 PM UTC-8 Kurtis Rader wrote: > It's because os.FileInfo is an interface, not a concrete type. > Specifically, it's an alias for io/fs.FileInfo. The concrete type returned > by os.Stat() is os.fileStat; a struct that implements the os.FileInfo > interface. While you can't refer to a private type like os.fileStat there > is nothing prohibiting the os package from returning a private type that > satisfies an interface. See, for example, > https://github.com/golang/go/blob/45f45444b307cea7c8330b100b30382e642e010f/src/os/stat_unix.go#L15-L26 > > On Sun, Mar 6, 2022 at 11:47 AM jlfo...@berkeley.edu <jlfo...@berkeley.edu> > wrote: > >> (go version go1.17.7 linux/amd64) >> >> Consider the following trivial program: >> ------ >> package main >> >> import ( >> "fmt" >> "os" >> ) >> >> func main() { >> file := "." >> fileinfo, _ := os.Stat(file) >> fmt.Printf("type of fileinfo = %T\n", fileinfo) >> } >> ------ >> >> This runs and produces the output >> >> type of fileinfo = *os.fileStat >> >> Fine, but notice that "fileStat" isn't capitalized. This means this >> symbol isn't >> exported outside the "os" package. Yet, somehow the "fileinfo" variable >> is assigned >> this type. >> >> Indeed, if I try to explicitly use the "os.fileStat" type in the program, >> the program fails to compile, e.g. >> >> ------------ >> package main >> >> import ( >> "fmt" >> "os" >> ) >> >> func main() { >> var fileinfo *os.fileStat >> >> file := "." >> fileinfo, _ = os.Stat(file) >> fmt.Printf("type of fileinfo = %T\n", fileinfo) >> } >> ----- >> results in >> >> ./x3.go:9:16: cannot refer to unexported name os.fileStat >> ./x3.go:12:14: cannot assign fs.FileInfo to fileinfo (type *os.fileStat) >> in multiple assignment: need type assertion >> ./x3.go:12:14: cannot use fs.FileInfo value as type *os.fileStat in >> assignment: need type assertion >> >> Notice the first error message. >> >> I also don't understand why the other two error message are produced when >> all I did was to explicitly declare a variable that was previously assigned >> a value in a short declaration. >> >> What am I missing? >> >> Cordially, >> Jon Forrest >> >> >> >> -- >> 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...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/golang-nuts/aef48e1e-e0c7-44e4-b62b-2fd1f6e5157bn%40googlegroups.com >> >> <https://groups.google.com/d/msgid/golang-nuts/aef48e1e-e0c7-44e4-b62b-2fd1f6e5157bn%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > > > -- > Kurtis Rader > Caretaker of the exceptional canines Junior and Hank > -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/1a9cd536-6c5e-432f-bdd2-76b9223ff5den%40googlegroups.com.