Michael, func openFile(s string, file *os.File) { file, err := os.Open(s) if err != nil { log.Fatal(err) } defer file.Close() }
There are two errors. When openfile returns file is closed and it is no longer valid. In Go, all arguments are passed by value, When openFile returns the value of file is discarded. openFile(fname, f) in main does not change the value of f. Peter On Wednesday, June 21, 2017 at 4:58:58 PM UTC, Michael Dwyer wrote: > > Peter, > > Thank you for your input regarding my question. > > In an effort to clear up any confusion or ambiguity regarding the problem > I am running into, > I will post the code for what is working and the code that is not working. > > The following block of code works, a valid file is passed to the > executable, the file is read > and the results of how many lines were read are emitted to stdout: > > package main > > import ( > "flag" > "bufio" > "fmt" > "log" > "os" > ) > > func cli() string { > flag.Parse() > return flag.Arg(0) > } > > func openFile(s string, file *os.File) { > file, err := os.Open(s) > if err != nil { > log.Fatal(err) > } > defer file.Close() > } > > func main() { > fname := cli() > f, err := os.Open(fname) > if err != nil { > log.Fatal(err) > } > defer f.Close() > ireader := bufio.NewReader(f) > scanner := bufio.NewScanner(ireader) > lcounter := 0 > for scanner.Scan() { > lcounter++ > } > fmt.Printf("# lines read : %d\n", lcounter) > } > > The following is an attempt to refactor the code by moving one section of > code, > specifically the code that opens a file handle returning a file descriptor > to variable named "f". > The file file descriptor "f" will then be used to create a buffered Reader > & Scanner. It is this code > that is not working, for which I seek assistance to understand why it is > not working, and for a solution > that adheres to what I was trying to do in the function named openFile(), > which is pass two parameters > to openFile(), the first, a string containing the path to be opened, the > second parameter will be a pointer > to os.File. > > What I am attempting to do here is to pass the path to be opened, while at > the same time pass a pointer > that will be used to return the file descriptor. The code that is not > working follows: > > package main > > import ( > "flag" > "bufio" > "fmt" > "log" > "os" > ) > > func cli() string { > flag.Parse() > return flag.Arg(0) > } > > func openFile(s string, file *os.File) { > file, err := os.Open(s) > if err != nil { > log.Fatal(err) > } > defer file.Close() > } > > func main() { > fname := cli() > var f *os.File > openFile(fname, f) > ireader := bufio.NewReader(f) > scanner := bufio.NewScanner(ireader) > lcounter := 0 > for scanner.Scan() { > lcounter++ > } > fmt.Printf("# lines read : %d\n", lcounter) > } > > I hope that I have been able to remove the ambiguity from the code, > and the intent of what it is I am trying to accomplish is clear. > > Again, thanks in advance to anyone that can help me resolve this issue. > > > THANX(MKD). > > -- 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.