一、标准库

  • 引入
    在我们之前所写的所以代码中,我们基本上可以看到fmt这个导入的包,但是我们却不知道如何去写这种包。
如果我们可以自己去写,那么我们就可以将一个功能的集合统一的放入包中,便于以后使用,那么我们如何去写这种包呢?
  • go的标准库
    在将自定义包之前我们可以先简单的看一下,fmt 我们是从哪里导过来的?我们可以自己去自己的GOROOT/src 下去查看,你们可以看到大致如下的包
src/
|- archive
|- bufio
|- builtin
|- bytes
..... 这一些的包,这些包我们称之为 go的标准库
想这样的包go 一共给我们提供来150个以上

二、自定义包

  • 包的声明
package pakName  // 此行必须写在第一行,且一个文件夹下的所有文件必须使用同一个包名
  • 包的导入
import (     // 导入包名必须写在package 包的声明下面
pak
....
)
  • 实例

    day14/calculator/calc.go

    package calc

    import "errors"

    func Calc(num1,num2 int,operator string) (int,error){
switch operator{
case "+":
return sum(num1,num2),nil
case "-":
return red(num1,num2),nil
case "*":
return ride(num1,num2),nil
case "/":
return exc(num1,num2),nil
default:
return 0,errors.New("不合法的运算符")
}
}
  • 解释
    pack calc
声明 day14/calculator/calc.go 属于calc 包
一个go文件有且仅输入一个包,一个包可以有多个go文件 import errors
导入标准库 errors 包 func Calc(){}
// 声明函数Calc ,
// 在go语言中 变量、类型、函数、方法 首字母大写表示 外部可以访问

三、关于包的使用

3.1 自定义calc 包

  • 目录
    day14/
|- calc.go
|- exc.go
|- red.go
|- ride.go
|- sum.go
  • calc.go
    package calc

    import "errors"

    func Calc(num1,num2 int,operator string) (int,error){
switch operator{
case "+":
return sum(num1,num2),nil
case "-":
return red(num1,num2),nil
case "*":
return ride(num1,num2),nil
case "/":
return exc(num1,num2),nil
default:
return 0,errors.New("不合法的运算符")
}
}
  • exc.go
    package calc

    func exc(num1,num2 int)int{
return num1 / num2
}
  • red.go
    package calc
func red(num1,num2 int)int{
return num1 - num2
}
  • ride.go
    package calc
func ride(num1,num2 int)int{
return num1 * num2
}
  • sum.go
    package calc
func sum(num1,num2 int)int{
return num2 + num1
}
  • 注意事项
 1、
day14/calculator文件夹下每个文件的声明 都是
package calc
表明 calculator下的所有文件(不包含文件夹)都属于calc包 2、
calculator文件夹的文件已经是calc包下的文件了,如果声明成其他包名,则编译会无法通过 3、
一个go文件有且仅属于一个包,一个包可以有多个go文件组成 4、
包的命名要简洁、清晰且全小写

3.2 使用自定义包

  • 调用calc包

    day14/example1/main.go
    package main

    import (
"day17/day14/calculator"
"fmt"
) func main(){
var (
num1 int = 12
num2 int = 4
) result,err := calc.Calc(num1,num2,"-")
if err != nil{
fmt.Println(err)
return
}
fmt.Printf("运算结果为:%v\n",result)
}
  • 注意事项
    外部调用calc包,只能使用Calc函数,如果使用calc包中的sum,exc,ride..这些方法,则会编译报错
因为calc包中 只有Calc函数允许外部访问,因为Calc 方法大写开头,所以允许外部访问 再次强调
包中的变量、类型、函数、方法,只有大写字母开头才能够被外部调用

四、结构体之包的使用

  • 结构体工厂

    day14/baozi/factory.go
package baozi

import "fmt"

// 创建工厂结构体
type baozi struct{
Kind string // 包子的种类
} func (this *baozi) Product(){
switch this.Kind {
case "rou":
fmt.Println("生产了一个肉包")
case "cai":
fmt.Println("生产了一个菜包")
default:
fmt.Println("生产了一个未知包")
}
} func NewBaozi(kind string)*baozi{
return &baozi{kind}
}
  • 包子工厂类的讲解
1、
type baozi struct{
Kind string // 包子的种类
}
在包子 包中我们创建了一个结构体,但是该结构体外部无法访问使用,
因为小写字母开头,只能内部使用 2、
func NewBaozi(kind string)*baozi{
return &baozi{kind}
}
在包子 包中提供了一个函数NewBaozi,只能通过调用NewBaozi创建baozi结构体 3、
为什么我们要通过NewBaozi函数创建结构体,而不直接使用baozi.baozi的方式创建呢?
通过函数创建结构体口可以忽略创建的细节。
  • 如何使用包子包中的结构体

    day14/example2/main
package main

import (
"day17/day14/baozi"
"fmt"
) func main(){
//baozi := baozi.baozi{"rou"} // 无法使用,因为baozi结构体 小写开头
baozi := baozi.NewBaozi("rou")
fmt.Println("包子的种类",baozi.Kind)
baozi.Product()
}
包子的种类 rou
生产了一个肉包

五、包的初始化init

day17/da14/test/init.go

package test

import "fmt"

func init(){
fmt.Println("test -- init")
} func Test(){
fmt.Println("this is test.test")
}

day17/da14/test1/init.go

package test1

import "fmt"

func init(){
fmt.Println("test1 -- init")
}

day17/da14/emample3/main.go

package main

import (
"fmt"
"day17/day14/test"
_ "day17/day14/test1" // _ 表示只执行init 函数,因为我们并不需要所有的函数
) func init(){
fmt.Println("main -- init ")
} func main(){
fmt.Println("main--main")
test.Test()
}
执行结果:
test -- init
test1 -- init
main -- init
main--main
this is test.test
结论:
1、init 函数会在main 函数之前执行
2、go 程序会更具导入包的顺序依次执行每一个包的init 函数

六、程序加载过程

如果喜欢看小说,请到183小说网

go package包的使用的更多相关文章

  1. 关于Visual Studio 未能加载各种Package包的解决方案

    问题: 打开Visual Studio 的时候,总提示未能加载相应的Package包,有时候还无法打开项目,各种提示 解决方案: 进入用户目录 C:\Users\用户名\AppData\Local\M ...

  2. 未能正确加载“visual C++ package”包

    早上打开360要卸载软件,跳出说系统修复,习惯性的点击修复,结果修复后发现打开vs2012提示“未能正确加载“visual C++ package”包……..”, 重启也一样,google了下,是因为 ...

  3. eclipse 包 取消代码第一行package包名 自动补全时取消自动引入包名 修改名字 取消引用 自动导入publilc static void main(String[] args) {}

    --项目 --包 包是为了管理类文件,同个包下不允许同名类文件,但不同包就可以,把类放在包里是规范 (https://zhidao.baidu.com/question/239471930532952 ...

  4. python开发者框架套件总结: package 包 frameworks

    python开发者的package 包 框架套件总结: frameworks     开发环境: anaconda pycharm django awesome-django : 介绍 django ...

  5. 如何同步删除svn管理的package包目录

    转:https://blog.csdn.net/shiwodecuo/article/details/51754598 eclipse在实际的开发中,当我们的项目由svn进行管理时,若想删除选中的整个 ...

  6. JavaSE入门学习17:Java面向对象之package(包)

           一Java包(package)        为了更好地组织类,Java提供了包机制,用于差别类名的命名空间.        包的作用:        A把功能类似或相关的类或接口组织在 ...

  7. 批量修改Java类文件中引入的package包路径

    http://libeey.blogbus.com/logs/101848958.html当复制其他工程中的包到新工程的目录中时,由于包路径不同,出现红叉,下面的类要一个一个修改包路径,类文件太多的话 ...

  8. error: Error: No resource found for attribute ‘layout_scrollFlags’ in package‘包名’

    遇到error: Error: No resource found for attribute 'layout_scrollFlags' in package'包名' 这个问题时候刚開始自己也是感觉到 ...

  9. 【转载】eclipse中批量修改Java类文件中引入的package包路径

    原博客地址:http://my.oschina.net/leeoo/blog/37852 当复制其他工程中的包到新工程的目录中时,由于包路径不同,出现红叉,下面的类要一个一个修改包路径,类文件太多的话 ...

随机推荐

  1. makefile 与 make

    所要完成的Makefile 文件描述了整个工程的编译.连接等规则.其中包括:工程中的哪些源文件需要编译以及如何编译.需要创建那些库文件以及如何创建这些库文件.如何最后产生我们想要的可执行文件.尽管看起 ...

  2. Java数组数据类型

    Java数组数据类型 数组是多个相同类型的数据的组合,数组中的元素可以是任何类型的数据: 一维数组 package com.ahabest.array; public class ArratTest ...

  3. sublime右键菜单,anaconda设置

    1.sublime_addright.inf [Version]Signature="$Windows NT$" [DefaultInstall]AddReg=SublimeTex ...

  4. BZOJ 2501 [usaco2010 Oct]Soda Machine

    [题意概述] 给出一个[0,1,000,000,000]的整数数轴,刚开始每个位置都为0,有n个区间加操作,最后询问数轴上最大的数是多少. [题解] 我写的是离散化后线段树维护区间最值. 其实貌似不用 ...

  5. 调用ms自带的合成语音TTS

    通过import of Component导入封装TTS引擎,然后选择: 最后调用: MyVoce := CoSpVoice.Create; MyVoce.Pause;//暂停 MyVoce.Stat ...

  6. 调度器Quartz的配置文件中的线程池设置

    在使用调度器Quartz来进行数据归档的时候,当我们开的定时任务很多的时候,就会出现一些定时任务不会被触发的现象,这就是线程阻塞.那到底什么叫线程阻塞呢? 线程阻塞,顾名思义就是说线程被阻塞了,没有按 ...

  7. [Poj2112][USACO2003 US OPEN] Optimal Milking [网络流,最大流][Dinic+当前弧优化]

    题意:有K个挤奶机编号1~K,有C只奶牛编号(K+1)~(C+K),每个挤奶机之多能挤M头牛,现在让奶牛走到挤奶机处,求奶牛所走的最长的一条边至少是多少. 题解:从起点向挤奶机连边,容量为M,从挤奶机 ...

  8. 使用applescript脚本方式以管理员权限运行

    - (BOOL) runProcessAsAdministrator:(NSString*)scriptPath                      withArguments:(NSArray ...

  9. 【ACM】hdu_1004_Let the Balloon Rise_201308141026-2

    Let the Balloon RiseTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  10. C++ primer chapter 12

    动态内存:之前的程序使用对象有着严格定义的生存期,会自动销毁.C++支持动态分配对象,动态分配对象的生存期和他们在哪里创建是无关的,只有当显式的被释放,这些对象才会销毁.标准库定义了智能指针对象可以自 ...