Files
- A quick HTTP file server example in Go
Basic example to serve directory.
package main import ( "flag" "fmt" "log" "net/http" ) func main() { // Simple static webserver: pathPtr := flag.String("d", ".", "Directory path to serve") portPtr := flag.String("p", "8080", "Port to listen on") interfacePtr := flag.String("i", "", "Interface to listen on (default all)") flag.Parse() log.Printf("Serving %s on %s:%s", *pathPtr, *interfacePtr, *portPtr) err := http.ListenAndServe(fmt.Sprintf("%s:%s", *interfacePtr, *portPtr), http.FileServer(http.Dir(*pathPtr))) if err != nil { log.Fatal(err) } }Example with ability to set custom headers
package main import ( "flag" "fmt" "log" "net/http" ) func main() { // Simple static webserver: pathPtr := flag.String("d", ".", "Directory path to serve") portPtr := flag.String("p", "8080", "Port to listen on") interfacePtr := flag.String("i", "", "Interface to listen on (default all)") flag.Parse() log.Printf("Serving %s on %s:%s", *pathPtr, *interfacePtr, *portPtr) fs := http.FileServer(http.Dir(*pathPtr)) err := http.ListenAndServe(fmt.Sprintf("%s:%s", *interfacePtr, *portPtr), customHeaders(fs)) if err != nil { log.Fatal(err) } } func customHeaders(fs http.Handler) http.HandlerFunc { // found at https://stackoverflow.com/a/65905091 return func(w http.ResponseWriter, r *http.Request) { // add headers etc here // return if you do not want the FileServer handle a specific request w.Header().Set("Cache-Control", "no-cache") w.Header().Set("x-server", "hello, world!") fs.ServeHTTP(w, r) } } - How to list files in a directory using Go [2023]
In Go there are a couple of options to list the files of a directory using the standard library. In this article you will find a list of three different methods.
Note: Be aware that
ioutil.ReadDiris deprecated since Go 1.16. Insteados.ReadDirshould be used (shown in this article).os.ReadDir
os.ReadDir is included in the standard library in the os package. Check out the documentation for more information. It’s a drop in replacement from
ioutil.ReadDir. - Golang Convert from Int to Hex
Converting from an Integer to hex is easy in Golang. Since a hex is really just an Integer literal, you can ask the fmt package for a string representation of that integer, using fmt.Sprintf(), and the %x or %X format.
package main import ( "fmt" ) func main() { for i := 1; i < 20; i++ { h := fmt.Sprintf("0x%x", i) fmt.Println(h) } }Output:
0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10 0x11 0x12 0x13Convert back to int
package main import ( "fmt" "strconv" ) var hex = []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "10", "11", "12", "13"} func main() { for _, h := range hex { i, _ := strconv.ParseInt(h, 16, 64) fmt.Println(i) } }Output:
- Golang Split Host Port to Separate Variables
Getting just the host or port from the “host:port” form is easy using the SplitHostPort function from the net package.
Below are some example uses of the function. As seen below, IPv6 addresses in hostport must be enclosed in square brackets.
package main import ( "fmt" "net" ) func main() { // IPv4 host, port, err := net.SplitHostPort("172.217.7.14:443") if err != nil { fmt.Println(err) } fmt.Println(host, port) // IPv6 host, port, err = net.SplitHostPort("[2607:f8b0:4006:800::200e]:443") if err != nil { fmt.Println(err) } fmt.Println(host, port) // Domain host, port, err = net.SplitHostPort("example.com:80") if err != nil { fmt.Println(err) } fmt.Println(host, port) }Output:
- Golang Listing Directory Contents and Sorting by File Modified Time
In this example we will be listing the contents of a directory in go and sorting by date.
To get the list of files we will use the os.ReadDir function from the os package. This function returns a slice sorted by file name which contains elements of os.FileInfo type which will enable us to get the last modified time.
To sort the files we will use the modification time with the sort package along with the After and Before functions from the time package.
- Golang Listing Directory Contents and Sorting by File Name
Listing the contents of a directory in go and sorting by filename.
To get the list of file we will use the ReadDir function from the os package.
To sort the files we will use the sort package to arrange the filenames alphabetically ascending or descending.
package main import ( "fmt" "io/fs" "log" "os" "sort" ) func checkErr(err error) { if err != nil { log.Fatal(err) } } // this is the default sort order of golang ReadDir func SortFileNameAscend(files []fs.DirEntry) { sort.Slice(files, func(i, j int) bool { return files[i].Name() < files[j].Name() }) } func SortFileNameDescend(files []fs.DirEntry) { sort.Slice(files, func(i, j int) bool { return files[i].Name() > files[j].Name() }) } func printFiles(files []fs.DirEntry) { for _, file := range files { fileInfo, err := file.Info() checkErr(err) fmt.Println(file.Name(), fileInfo.Size(), fileInfo.ModTime()) } } func main() { files, err := os.ReadDir(".") if err != nil { log.Fatal(err) } //SortFileNameAscend(files) printFiles(files) fmt.Println("\n-----------------------------------\n") SortFileNameDescend(files) printFiles(files) } - Golang Listing Directory Contents and Sorting by File Size
Listing the contents of a directory in go and sorting by file size.
To get the list of file we will use the ReadDir function from os package.
To sort the files we will use the sort package and compare the file sizes to arrange them in ascending or descending order.
package main import ( "fmt" "io/ioutil" "log" "os" "sort" ) func SortFileSizeAscend(files []os.FileInfo) { sort.Slice(files, func(i, j int) bool { return files[i].Size() < files[j].Size() }) } func SortFileSizeDescend(files []os.FileInfo) { sort.Slice(files, func(i, j int) bool { return files[i].Size() > files[j].Size() }) } func printFiles(files []os.FileInfo) { for _, file := range files { fmt.Println(file.Name(), file.Size(), file.ModTime()) } } func main() { files, err := ioutil.ReadDir(".") if err != nil { log.Fatal(err) } SortFileSizeAscend(files) printFiles(files) fmt.Println("\n-----------------------------------\n") SortFileSizeDescend(files) printFiles(files) }