11-Go语言进阶-01

包的使用

  1. 引入时,用.做前缀,使用时可以省略包名,不建议这么使用
  2. 可以前缀别名
  3. "_"下划线操作,可以执行包里面对应的init函数
  4. 首字母大写的字段和实体,才能被外部引用

init函数和main函数

  1. 这两个函数都是GO语言中的保留函数,init用于初始化,main函数作为程序入口
  2. 这两个函数不能有参数,返回值。只能由go程序自动调用
  3. init函数可以定义在任意的包中,可以有多个。main函数只能在main包下,且只有一个
  4. 执行顺序
    1. 先执行init函数,在执行main函数
    2. 对于同一个go文件中,调用顺序是从上到下
    3. 对于同一个包下,是按文件名称从上到下
    4. 对于不同包下
      如果不存在依赖,则按import的顺序来调用init
      如果存在依赖,最后被依赖的最先被初始化
    5. 存在依赖的包之间,不能循环导入

引用外部包

cmd命令

go get github.com/go-sql-driver/mysql
import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	open, err := sql.Open("mysql", "用户名:密码@tcp(127.0.0.1:3306)/zzystudy?useUnicode=true&characterEncoding=utf8&useSSL=true")
	if err != nil {
		fmt.Println(1, err)
	} else {
		fmt.Println(0, open)
	}
}

断点续传

func main() {
	fileName := "构建高性能WEB站点.pdf"
	fileNamePath1, _ := filepath.Abs(fileName)
	copyFilePath := fileNamePath1[:strings.LastIndex(fileNamePath1, "\\")+1] + "copy" + fileName
	tempFile := copyFilePath + "temp.txt"
	fmt.Println(tempFile)
	file1, _ := os.Open(fileNamePath1)
	file2, _ := os.OpenFile(copyFilePath, os.O_CREATE|os.O_RDWR, os.ModePerm)
	file3, _ := os.OpenFile(tempFile, os.O_CREATE|os.O_RDWR, os.ModePerm)
	defer file1.Close()
	defer file2.Close()

	file3.Seek(0, io.SeekStart)
	bs := make([]byte, 100, 100)
	n1, _ := file3.Read(bs)
	countStr := string(bs[:n1])
	count, _ := strconv.ParseInt(countStr, 10, 64)
	fmt.Println(count)

	file1.Seek(count, io.SeekStart)
	file2.Seek(count, io.SeekStart)
	data := make([]byte, 1024, 1024)
	n3 := -1
	total := int(count)
	for {
		n2, err := file1.Read(data)
		if err == io.EOF || n2 == 0 {
			fmt.Println("复制完毕")
			file3.Close()
			os.Remove(tempFile)
			break
		}
		// 模拟断点
		if total > 90000000 {
			break
		}
		n3, _ = file2.Write(data)
		total += n3
		file3.Seek(0, io.SeekStart)
		file3.WriteString(strconv.Itoa(total))
	}
}

posted @ 2022-11-14 17:23  花茶冰糖  阅读(9)  评论(0编辑  收藏  举报