• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

3、go的package和使用

武飞扬头像
roo_1
帮助4


一、package

参考文章: 知乎:go语言 包(package)详解

go语言的包(package)是多个Go源码的集合,go语言有很多内置包,比如fmt,os,io等。我们也可以自定义包。在一个go语言程序中使用其它包的对象或者函数时,首先要通过 import 引入它。

该文件夹下面的所有go文件都要在代码的第一行添加如下代码,声明该文件归属的包。

package 包名

注意事项:

  1. 一个文件夹下面直接包含的文件只能归属一个package,同样一个package的文件不能在多个文件夹下。
  2. 包名可以不和文件夹的名字一样,包名不能包含 - 符号。
  3. 包名为main的包为应用程序的入口包,这种包编译后会得到一个可执行文件,而编译不包含main包的源代码则不会得到可执行文件。

参考: go语言学习 package

1.1 引入包的路径

  1. 第一种方式相对路径:
import "./module" // 引入的包在当前文件同一目录的 module 目录
  1. 第二种方式绝对路径:
import "LearnGo/init" // 引入的包在 gopath/src/LearnGo/init 目录。

1.2 引入包的特殊方式

下面展示一些特殊的 import 方式。

  1. 点操作

这个点操作的含义就是这个包导入之后,在调用这个包的函数时,可以省略前缀的包名

import . "fmt"
// 例如:fmt.Println("hello world") 可以省略的写成 Println("hello world")。
  1. 别名操作

别名操作就是可以把包命名成另一个容易记忆的名字。

import f "fmt"
// 别名操作的话调用包函数时前缀变成了我们的前缀,即 f.Println("hello world")。
  1. _ 操作

_操作是一个让很多人费解的操作符,例如:

import _ "github.com/go-sql-driver/mysql"
// _操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的 init 函数。

go get XXXX
学新通


二、多package使用

参考文章: go语言多package使用实战

测试下go多page包调用时是如何实现的

2.1 同一目录下使用

  1. 不用import,直接调用函数
  2. 多个文件中,只能有一个文件有main()函数

学新通

mysql.go文件

package main

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

func main() {
	db, err := sql.Open("mysql", "root:Qaz123456!@tcp(106.12.242.175:3306)/dtspgtest?charset=utf8")
	if err != nil {
		fmt.Println(err)
	}
	// 确保db正常关闭
	defer db.Close()
	// 使用前Ping, 确保db连接正常
	err = db.Ping()
	if err != nil {
		fmt.Println(err)
	}

	// 创建
	create()
}

学新通

test.go文件

package main

import (
	"database/sql"                     //sql.Open加载包
	_ "github.com/go-sql-driver/mysql" //没用到包里的内容但是需要加载一下这个包.
	"log"
)

func create() {
	db, err := sql.Open("mysql", "root:Qaz123456!@tcp(106.12.242.175:3306)/gotest") //声明数据库类型为mysql 使用用户名,密码,连接形式,链接地址和端口,指定数据库
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()
	err = db.Ping()
	if err != nil {
		log.Fatal(err)
	}
	log.Println("数据库连接成功")
	//定义一个创建数据库表的变量,后续进行exec的调用.
	createTable := "CREATE TABLE `gousertest` (`uid` int(10) NOT NULL AUTO_INCREMENT,`username` varchar(64) NOT NULL DEFAULT '1', `gender` tinyint(1) DEFAULT NULL,`password` varchar(64) DEFAULT NULL,`created` date DEFAULT NULL,PRIMARY KEY (`uid`)) ;"
	_, err = db.Exec(createTable)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("数据库创建成功")
}

学新通

学新通
学新通
两个文件都属于同一个main包,直接编译即可

2.2 同一目录多个包时

参考文章1: 一个例子明白go 的package
参考文章2: 如何使用go module导入本地包

实战

main()文件运行,使用go.mod所在的文件路径开始import,函数中要使用import的内容,不然会被删除掉

学新通

同目录下面的test.go文件有相同的package的名字,同目录别的文件调用的时候,直接使用create()函数,不用import

学新通

不同目录调用的时候,需要import;import之后,直接使用函数即可

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfiaheb
系列文章
更多 icon
同类精品
更多 icon
继续加载