Go语言开发小技巧&易错点100例(十三)

往期回顾:

本期看点(技巧类用【技】表示,易错点用【易】表示)

  • Go HTTP文件上传下载【技】
  • Go程序弹出浏览器【技】

正文开始:

Go HTTP文件上传下载

这段代码是一个简单的Go语言HTTP服务器,主要实现了文件上传和文件下载的功能。

  • uploadPath:定义了上传文件的存储路径。
  • maxUploadSize:定义了允许上传的最大文件大小为10MB。
go 复制代码
package main

import (
	"fmt"
	"io"
	"math/rand"
	"net"
	"net/http"
	"os"
	"path"
	"path/filepath"
)

const (
	uploadPath    = "tmp"
	maxUploadSize = 10 << 20 //10MB
)

func main() {
	listen, _ := net.Listen("tcp", ":8888")

	//文件上传
	http.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {
		if err := r.ParseMultipartForm(maxUploadSize); err != nil {
			fmt.Printf("ParseMultipartForm err = %s", err)
			return
		}

		file, fileHeader, err := r.FormFile("file")
		if err != nil {
			fmt.Printf("FormFile err = %s", err)
			return
		}

		defer func() {
			_ = file.Close()
		}()

		if fileHeader.Size > maxUploadSize {
			fmt.Printf("max err = %s", err)
			return
		}

		fileBytes, err := io.ReadAll(file)
		if err != nil {
			fmt.Printf("read err = %s", err)
			return
		}

		newFileName := randToken(12) + path.Ext(fileHeader.Filename) //新文件名+后缀
		newFile, err := os.Create(filepath.Join(uploadPath, newFileName))
		if err != nil {
			fmt.Printf("Create err = %s", err)
			return
		}

		defer func() {
			_ = newFile.Close()
		}()

		if _, err := newFile.Write(fileBytes); err != nil || newFile.Close() != nil {
			fmt.Printf("Write err = %s", err)
			return
		}
		_, _ = w.Write([]byte("ok"))
	})

	//文件下载  http://localhost:8888/static/9a621d729566c74d10037c4d.jpg
	http.Handle("/static/", http.FileServer(http.Dir(uploadPath)))

	_ = http.Serve(listen, nil)
}

func randToken(len int) string {
	b := make([]byte, len)
	rand.Read(b)
	return fmt.Sprintf("%x", b)
}
Go程序弹出浏览器

这段Go语言代码主要包含了两个函数:mainOpenmain函数是程序的入口点,它调用了Open函数,并传入了一个URL字符串作为参数。Open函数则用于执行一个外部命令,尝试在Windows系统的命令提示符(cmd)中打开指定的URL。此外,还定义了一个名为execCommand的函数,它用于执行任意命令,并读取命令的标准输出。

go 复制代码
package main

import (
   "bufio"
   "fmt"
   "io"
   "os/exec"
   "time"
)

func main() {
   _ = Open("http://localhost:8889")
}

func Open(uri string) error {
   cmd := exec.Command("cmd", "/C", "start "+uri)
   return cmd.Run()
}

// 执行cmd命令
func execCommand(commandName string, params []string) bool {
   cmd := exec.Command(commandName, params...)

   stdout, err := cmd.StdoutPipe()
   if err != nil {
      return false
   }

   if err := cmd.Start(); err != nil {
      panic(err)
   }

   reader := bufio.NewReader(stdout)
   for {
      out, err2 := reader.ReadBytes('\n')
      if err2 != nil || io.EOF == err2 {
         break
      }
      fmt.Println(string(out))
   }
   if err := cmd.Wait(); err != nil {
      panic(err)
   }
   return true
}

结束~

相关推荐
L_autinue_Star1 小时前
手写vector容器:C++模板实战指南(从0到1掌握泛型编程)
java·c语言·开发语言·c++·学习·stl
元气小嘉1 小时前
前端技术小结
开发语言·前端·javascript·vue.js·人工智能
励志的大鹰哥2 小时前
V少JS基础班之第七弹
开发语言·javascript·ecmascript
AI360labs_atyun2 小时前
Java在AI时代的演进与应用:一个务实的视角
java·开发语言·人工智能·科技·学习·ai
凤年徐3 小时前
【数据结构与算法】203.移除链表元素(LeetCode)图文详解
c语言·开发语言·数据结构·算法·leetcode·链表·刷题
nbsaas-boot3 小时前
多租户架构下的多线程处理实践指南
java·开发语言·spring
无小道3 小时前
c++--typedef和#define的用法及区别
c语言·开发语言·汇编·c++
SoniaChen334 小时前
Rust基础-part2-变量和可变类型
开发语言·后端·rust
神所夸赞的夏天5 小时前
c#获取Datatable中某列最大或最小的行数据方法
开发语言·c#
h0l10w5 小时前
【Java】MongoDB
java·开发语言·mongodb