- linux操作系统_2014-04-16_1
- linux操作系统_2014-04-16_2
- linux操作系统_2014-04-16_3
- Video_2014-03-29_193638递归
- Video_2014-03-29_xiawu
- Video_2014-03-29_上午
- Video_2014-03-31_165832数组
- Video_2014-03-31_函数
- Video_2014-04-01_120548二分查找以及外挂
- Video_2014-04-01_165511指针
- Video_2014-04-01_172728总结
- Video_2014-04-01_二维数组
- Video_2014-04-03_170255动态
- Video_2014-04-03_指针
- Video_数组指针
- Video_2014-04-07_145027
- Video_2014-04-08_104158上午字符串输出
- Video_2014-04-08_120209上午字符串
- Video_2014-04-08_151454
- Video_2014-04-08_164346
- Video_2014-04-09_165651
- Video_2014-04-09_183504
- Video_2014-04-09_200356
- 01-就业班接口封装和设计思想引导及初步实践-王保明
- 02-就业班cc++课程总体安排
- 03-就业班学员要求及小结
- 04-排序热身及数组做函数参数退化为指针引申
- 05-数据类型本质及变量本质分析-王保明
- 06-中午课程总结8
- 07-程序内存四区和函数调用模型-王保明
- 08-内存四区深入理解-王保明
- 09-铁律1指针也是一种数据类型-王保明
- 10-工程开发中指针初步-易犯模型
- 01-day01复习及不断修改指针变量含义场景建立
- 02-间接赋值成立的三个条件-王保明
- 03-间接赋值是指针存在的最大意义场景-现实意义-王保明
- 05-中午课程总结
- 06-函数原型使用思路及自写copy函数技术推演
- 07-项目开发中字符串操作模型积累1
- 08-实战练习
- 09考试题
- 01-字符串开发-两头堵模型建立
- 02-字符串开发-反转模型建立
- 03-工程开发中字符串操作易犯错误模型
- 04-keyvalude作业项目开发写法展示
- 05-作业点评
- 06-const专题讲座
- 关键字作业意思描述
- 07-初识二级指针第一种内存模型
- 08-初识第二种内存模型
- 09-初识第三种内存模型
- 10-两个辅助指针变量挖字符
- 01-考试题2
- 02-学生作业点评
- 03-数组类型基础及数组指针基础-王保明
- 04-数组指针用法
- 05-多维数组本质-王保明
- 06-多维数组做函数参数推演-王保明
- 07-二级指针输入三种内存模型图-王保明
- 08-指针数组案例讲解-王保明
- 01-课 程复习
- 02-怎么区分指针数组和数组指针
- 03-野指针问题抛出
- 04-避免野指针方法-王保明
- 05-结构体操作的基础
- 06-结构变量copy行为研究初步
- 07-结构做函数参数
- 08-结构体操作01
- 08-指针变量和它所指向的内存空间是两个不同的概念-王保明
- 09-项目开发一级指针要点-王保明
- 11-项目开发-二级指针要点-王保明
- 12-深copy和浅copy
- 01-结构体复习
- 02-点评作业
- 03文件读写基本api01
- 04-按照行读写
- 05-freadfwrite
- 06-配置文件接口封装和设计思想引导
- 01-考试题
- 02-考试及课堂点评-二级指针做输入学习标准
- 03-二级指针易犯错误模型深入剖析
- 04-二级指针输出模型建立-王保明
- 04-一级指针内存模型分析-王保明
- 05-二级指针易犯错误模型-王保明
- 06-玩转多级指针-王保明
- 07-动态库调用流程演示
- 08-多级指针入栈出栈分析
- 09-动态库开发环境搭建
- 10-动态库核心源码编写-王保明
- 11-动态库设计和实现-加日志-王保明
- 12-作业
- 13-第二套动态库api
- 01-文件专题复习
- 02-动态库
- 03-多级指针是重点
- 04-结构体链表基础
- 05-链表操作-创建遍历
- 06-链表操作-删除和插入-王保明
- 07-链表基本操作代码优化
- 08-链表逆置操作-王保明
- 09-结构体高级话题
- 10-linux内核链表了解
- 12-linux内核链表补充
- 01-c语言框架总结
- 02-学生作品点评
- 03-cplusplus和c语言的关系
- 04-类和对象的hello例子
- 05-hello易犯错误模型-王保明
- 06-namespace点
- 07-namespace和iostream
- 08-register关键字功能增强
- 09-全局变量cplusplus不同
- 10-struct类型加强
- 11-cplusplus类型检测增强
- 12-bool类型补充
- 12-bool类型注意点
- 01-课程复习及课堂纪要
- 02-引用专题讲座2
- 03-const引用
- 04-函数加强
- 05-cplusplus授课路线
- 07_面向过程编程到面向对象编程训练1
- 08_面向过程编程到面向对象编程训练2
- 09_面向对象编程cpp和h分离
- 10_对象初始化及有参构造函数
- 01_考试试题01
- 02_考试试题2
- 03_考试试题0304
- 04_copy构造函数场景3
- 05_copy构造函数场景4-王保明
- 06_深copy浅copy-王保明
- 07-有关匿名对象的补充说明-王保明
- 08-深copy浅copy中的copy构造和=函数的区别
- 09-构造函数初始化列表
- 10-临时对象深入理解-王保明
- 12-new和delete专题讲座
- 13-static专题
- 01-构造析构课程重要点复习
- 02-成员函数和全局函数pk-王保明
- 03-链表货物类
- 04-友元函数友元类
- 05-操作符重载技术入门推演
- 06-操作符重载的两种方法1
- 07-全局函数friend应用场景链式编程
- 08-数组类操作符重载环境说明
- 09-第一个函数提示
- 10-【】操作符重载讲解-王保明
- 11-第二个函数代码讲解-王保明
- 12-第三个第四个函数重载代码讲解
- 13-cocos2d-x源码
- 进程控制_2014-05-28_1
- 进程控制_2014-05-28_2
- 进程控制_2014-05-28_3
- 进程控制_2014-05-28_4
- 进程控制_2014-05-28_5
- 01-操作符重载知识点及作业点评
- 02-子类继承三种方式
- 03-friend友元函数申明和应用易错点
- 04-继承中的重名和static
- 05-继承中的构造和析构基础
- 06-继承中的混搭风-王保明
- 07-extern修饰全局变量常用套路
- 08-static静态变量分配内存
- 08-static静态变量分配内存补充
- 09-多继承二义性及虚继承解决方法
- 10-多态基础01
- 11-多态案例-王保明
- 12-多态的工程意义及多态成立的三个条件-王保明
- 01-课程复习
- 02-重载与重写-王保明
- 03-多态理解面试题层次应答-王保明
- 04-c++编译器多态的实现探究-王保明
- 05-父类构造函数中能产生多态吗1
- 05-父类构造函数中能产生多态吗2-原理解释-王保明
- 06-子类对象和父类指针混搭-王保明
- 07-为什么需要虚析构函数-王保明
- 08-中午课程总结
- 09-抽象类语法基础
- 10-接口类在多继承中的应用-王保明
- 11-cplusplus中接口的封装和设计和模块界面分工(软件架构初步)
- 12-cplusplus接口类模型框架搭建-王保明
- 01-上层课程复习
- 02-函数指针语法基础-王保明
- 03-函数指针正向调用-王保明
- 04-动态库回调函数概念理解
- 05-socket动态库开发环境搭建1
- 06-socket动态库回调函数开发01-王保明
- 07-socket动态库回调函数开发02-王保明
- 08-socket动态库回调函数第二种写法-王保明
- 09-泛型编程语法基础
- 10-泛型编程强化
- 11-函数模板遇上函数重载
- 12-函数模板实现本质探究-王保明
- 01-上一次课程复习
- 02-stl基本概念
- 03-stl的vector入门
- 04-stl的stack入门
- 05-stl的queue入门
- 06-stl链表入门-迭代器用法展示
- 07-stl算法回调基础
- 扯淡1
- Video_2014-05-14_095643
- Video_2014-05-14_105847
- 07-企业级财富库线性表-顺序存储开发和设计01-王保明
- 08-企业级财富库线性表-顺序存储开发和设计02-王保明
- 01-上次课程复习
- 02-企业级财富库-线性表设计与实现-王保明
- 03-线性表顺序存储和链式存储优缺点比较
- 04-企业级财富库-循环链表的入门和使用
- 05-企业级财富库-循环链表代码分析-王保明
- 06-企业级财富库-循环链表代码分析补充
- 07-企业级财富库-双向链表-测试应用
- 08-企业级财富库-双向链表代码讲解-王保明
- 09-企业级财富库-seqstack设计与实现01-王保明
- 10-企业级财富库-seqstack设计与实现02-王保明
- 11-企业级财富库-seqstack设计与实现03-王保明
- 12-企业级财富库-linkstack设计与实现01-王保明
- 01-上 一次课程复习
- 02-栈的应用思路及代码分析
- 03-企业级财富库-队列顺序存储设计与实现-王保明
- 04-企业级财富库-队列链式存储设计与实现-王保明
- 05-树的基本概念及二叉树的基本概念
- 06-二叉树性质-
- 07-二叉树遍历基础
- 08-二叉树遍历编程基础
- 09-二叉树copy
- 10-二叉树非递归算法-王保明
- 11-二叉树非递归算法2-王保明
- 01-上次 课程复习
- 02-根据先序遍历和中序遍历来建树
- 03-根据通过先序遍历+空格建树
- 04-生成线索化树算法讲解
- 05-中序线索化化二叉树代码讲解
- 06-霍夫曼树
- 07-排序基本概念
- 08-选择排序法
- 09-插入法
- 10-冒泡
- 11-快速排序
- 12-快速排序思想
- 13-补充
- linux操作系统_2014-04-16_1
- linux操作系统_2014-04-16_2
- linux操作系统_2014-04-16_3
- linux操作系统_2014-05-23_1
- linux操作系统_2014-05-23_2
- linux开发环境_2014-05-25_1
- linux内存管理_2014-05-25_1
- linux文件管理_2014-05-25_1
- linux文件管理_2014-05-25_2
- linux文件管理_2014-05-25_3
- linux文件管理_2014-05-26_1
- linux文件管理_2014-05-26_2
- linux文件管理_2014-05-26_3
- linux文件管理_2014-05-26_4
- linux文件管理_2014-05-26_5
- linux文件管理_2014-05-26_6
- 进程间通信_2014-05-29_1
- 进程间通信_2014-05-29_2
- 进程控制_2014-05-28_1
- 进程控制_2014-05-28_2
- 进程控制_2014-05-28_3
- 进程控制_2014-05-28_4
- 进程控制_2014-05-28_5
- 进程控制_2014-05-29_1
- 多线程_2014-05-31_1
- 多线程_2014-05-31_2
- 多线程_2014-05-31_3
- 01-构造析构课程重要点复习
- 02-成员函数和全局函数pk-王保明
- 03-链表货物类
- 04-友元函数友元类
- 05-操作符重载技术入门推演
- 06-操作符重载的两种方法1
- 07-全局函数friend应用场景链式编程
- 08-数组类操作符重载环境说明
- 09-第一个函数提示
- 10-【】操作符重载讲解-王保明
- 11-第二个函数代码讲解-王保明
- 12-第三个第四个函数重载代码讲解
- 13-cocos2d-x源码
- qq习题讲座
- QT编程_2014-06-5_1
- QT编程_2014-06-5_2
- QT编程_2014-06-5_3
- QT编程_2014-06-5_4
- QT编程_2014-06-5_5
- 数据库编程_2014-06-9_1
- 数据库编程_2014-06-9_2
- 数据库编程_2014-06-9_3
- 数据库编程_2014-06-9_4
- 数据库编程_2014-06-9_5
- 数据库编程_2014-06-9_6
- 数据库编程_2014-06-9_7
- 数据库编程_2014-06-9_8
- 数据库编程_2014-06-9_9
- 数据库编程_2014-06-9_10
- 数据库编程_2014-06-9_11
- 数据库编程_2014-06-9_12
- 数据库编程_2014-06-9_13
- 数据库编程_2014-06-9_14
- 数据库编程_2014-06-9_15
- 项目实战CDMA基站管理_2014-06-12_1
- 项目实战CDMA基站管理_2014-06-12_2
- 项目实战CDMA基站管理_2014-06-12_3
- 项目实战CDMA基站管理_2014-06-12_4
- 项目实战CDMA基站管理_2014-06-12_5
- 项目实战CDMA基站管理_2014-06-12_6
- 项目实战CDMA基站管理_2014-06-12_7
- 项目实战CDMA基站管理_2014-06-12_8
- 项目实战CDMA基站管理_2014-06-12_9
- 项目实战CDMA基站管理_2014-06-13_1
- 项目实战CDMA基站管理_2014-06-13_2
- 项目实战CDMA基站管理_2014-06-13_3
- 项目实战CDMA基站管理_2014-06-13_4
- 项目实战CDMA基站管理_2014-06-13_5
- 项目实战CDMA基站管理_2014-06-13_6
- 项目实战CDMA基站管理_2014-06-13_7
- oracle安装_2014-06-14_3
- oracle安装_2014-06-14_4
- oracle安装_2014-06-14_5
- oracle安装_2014-06-14_6
- oracle编程_2014-06-16_1
- oracle编程_2014-06-16_2
- oracle编程_2014-06-16_3
- oracle编程_2014-06-16_4
- oracle编程_2014-06-16_5
- myqq项目实战_2014-06-17_1
- myqq项目实战_2014-06-17_2
- myqq项目实战_2014-06-17_3
- myqq项目实战_2014-06-17_4
- myqq项目实战_2014-06-17_5
- myqq项目实战_2014-06-18_1
- myqq项目实战_2014-06-18_2
- myqq项目实战_2014-06-18_3
- myqq项目实战_2014-06-18_4
- myqq项目实战_2014-06-18_5
- myqq项目实战_2014-06-18_6
- 项目实战CDMA基站管理_2014-06-14_1
- httpserver项目实战_2014-06-19_2
- httpserver项目实战_2014-06-19_3
- httpserver项目实战_2014-06-19_4
- httpserver项目实战_2014-06-19_5
- 1.linux环境搭建(上)
- 1.场景-层-精灵-导演模型
- 01.场景管理
- 02.精灵的创建-帧和纹理的概念-缓存概念
- 03.三个特殊层
- 04.坐标体系
- 01.ZORDERAndTag
- 02.CCLabelTTF和字体
- 03.CCLabelAtlas和CCLabelBMFont
- 04.批处理精灵节点
- 05.批处理精灵测试
- 06.C++的四种cast
- 1.textFieldTTF
- 2.CCEditBox
- 3.menu基础和MenuItem
- 1.菜单特效-课程菜单实现
- 2.menu的点击连续响应实现
- 3.CCControlSwith和CCControlSlider
- 1.draw
- 2.schedule定时器
- 3.progressTimer
- 1.CCProgressTimer和CCProgressTo
- 2.CCScrollView
- 3.CCTableView
- 4.内存管理
- 1.象棋(开始场景和棋盘布置)
- 2.摆起设置
- 1.布局结束
- 2.选择要走的棋子
- 3.走棋完成
- 网络编程_2014-06-1_1
- 网络编程_2014-06-1_2
- 网络编程_2014-06-1_3
- 网络编程_2014-06-1_4
- 网络编程_2014-06-1_5
- 网络编程_2014-06-1_6
- 网络编程_2014-06-3_1
- 网络编程_2014-06-3_2
- 网络编程_2014-06-3_3
- 网络编程_2014-06-3_4
- 网络编程_2014-06-3_5
- shell编程_2014-06-4_1
- shell编程_2014-06-4_2
- shell编程_2014-06-4_3
- win的hook制作方法_2014-06-4_1
- win的hook制作方法_2014-06-4_2
- QT编程_2014-06-6_1
- QT编程_2014-06-6_2
- QT编程_2014-06-6_3
- QT编程_2014-06-6_4
- QT编程_2014-06-6_5
- QT编程_2014-06-6_6
- 1.action
- xs-用法
- 1.单机象棋完成
- 2.象棋人工智能
- xs-用法
- 1.网络版象棋设计
- 1.windows象棋网络-技术和业务概念
- 1.坦克移动
- 01-操作符重载知识点及作业点评
- 02-子类继承三种方式
- 03-friend友元函数申明和应用易错点
- 04-继承中的重名和static
- 05-继承中的构造和析构基础
- 06-继承中的混搭风-王保明
- 07-extern修饰全局变量常用套路
- 08-static静态变量分配内存
- 08-static静态变量分配内存补充
- 09-多继承二义性及虚继承解决方法
- 10-多态基础01
- 11-多态案例-王保明
- 12-多态的工程意义及多态成立的三个条件-王保明
- 01-课程复习
- 02-重载与重写-王保明
- 03-多态理解面试题层次应答-王保明
- 04-c++编译器多态的实现探究-王保明
- 05-父类构造函数中能产生多态吗1
- 05-父类构造函数中能产生多态吗2-原理解释-王保明
- 06-子类对象和父类指针混搭-王保明
- 07-为什么需要虚析构函数-王保明
- 08-中午课程总结
- 09-抽象类语法基础
- 10-接口类在多继承中的应用-王保明
- 11-cplusplus中接口的封装和设计和模块界面分工(软件架构初步)
- 12-cplusplus接口类模型框架搭建-王保明
一 简介
Go语言出自Ken Thompson、Rob Pike和Robert Griesemer之手,起源于2007年,并在2009年正式对外发布,其实都是Google的,设计Go语言的初衷都是为了满足Google的需求。Go的主要目标是“兼具Python等动态语言的开发速度和C/C++等编译型语言的性能与安全性”,旨在不损失应用程序性能的情况下降低代码的复杂性,具有“部署简单、并发性好、语言设计良好、执行性能好”等优势。最主要还是为了并发而生,并发是基于goroutine的,goroutine类似于线程,但并非线程,可以将goroutine理解为一种虚拟线程。Go语言运行时会参与调度goroutine,并将goroutine合理地分配到每个CPU中,最大限度地使用CPU性能。
二 环境
我们玩Java的时候需要下载JDK,类似于此,用Go开发也需要下载Go,里面提供各种develop-kit、library以及编译器。在官网下载mac版本pkg后直接安装,最后用 go version 命令验证版本:
然后就是设置这两个环境变量,mac系统是在 .bash_profile 文件里面:
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
GOROOT:表示的是Go语言编译、工具、标准库等的安装路径,其实就相当于配置JAVA_HOME那样。
GOPATH:这个和Java有点不一样,Java里并不需要设置这个变量,这个表示Go的工作目录,是全局的,当执行Go命令的时候会依赖这个目录,相当于一个全局的workspace。一般还会把$GOPATH/bin设置到PATH目录,这样编译过的代码就可以直接执行了。
1 纯文本开发
编写代码,可以保存在任意地方,例如新建一个helloworld目录,创建hello.go文件:
package main
import "fmt"
func main() {
fmt.Println("hello, world")
}
然后执行 go build hello.go 就可以编译出hello文件,在./hello就可以执行了;或者直接 go run hello.go 合二为一去执行。执行这个命令并不需要设置环境变量就可以了。看起来和c差不多,但是和Java不一样,运行的时候不需要虚拟机。早期的GO工程也是使用Makefile来编译,后来有了强大的命令 go build、go run,可以直接识别目录还是文件。
2 GoLand
自动import,超爽的体验!不用按command + /了!
运行项目需要设置build config,和Android、Java的都差不多,例如创建一个hello-goland项目:
导入go module项目的时候需要勾选这项,否则无法像maven/gradle那样sync下载依赖:
3 VSCODE
直接搜索Go插件,第一个最多安装量的就是了,我还没用过所以不太清楚如何。
三 工程结构
在设置GOPATH环境变量的时候,这个目录里面又分了三个子目录bin、pkg、src,分别用于存放可执行文件、包文件和源码文件。当我们执行Go命令的时候,如果我们指定的不是当前目录的文件或者绝对路径的目录的话,就会去GOPATH目录的去找。这样在GOPATH目录创建了xxx的目录后,就可以在任意地方执行 go build xx 命令来构建或者运行了。
pkg目录应该是在执行 go install 后生成的包文件,包括.a这样的文件,相当于一个归档。
├── bin
│ ├── air
│ ├── govendor
│ ├── swag
│ └── wire
├── pkg
│ ├── darwin_amd64
│ ├── mod
│ └── sumdb
└── src
├── calc
├── gin-blog
├── github.com
├── golang.org
├── google.golang.org
├── gopkg.in
└── simplemath
这样对于我们具体项目来说并不好,没有Workspace的概念来隔离每个项目了,所以我觉得这个GOPATH目录放的应该是公用的项目,例如开源依赖的。我们在开发过程中,也会下载很多的依赖,这些依赖都下载到这个目录,和我们的项目文件混在一起了。
另外,通过IDE可以设置project的GOPATH,相当于在执行的时候给GOPATH增加了一个目录变量,也就是说,我们创建一个项目,然后里面也有bin、src、pkg这三个目录,和GOPATH一样的,本质上,IDE在运行的时候其实就是设置了一下GOPATH:
GOPATH=/Users/fuxing/develop/testgo/calc-outside:/Users/fuxing/develop/go #gosetup
Go语言在寻找变量、函数、类属性及方法的时候,会先查看GOPATH这个系统环境变量,然后根据该变量配置的路径列表依次去对应路径下的src目录下根据包名查找对应的目录,如果对应目录存在,则再到该目录下查找对应的变量、函数、类属性和方法。
其实官方提供了Go Modules的方法更好解决。
1 Go Modules
从Go 1.11版本开始,官方提供了Go Modules管理项目和依赖,从1.13版本开始,更是默认开启了对Go Modules的支持,使用Go Modules的好处是显而易见的 —— 不需要再依赖GOPATH,你可以在任何位置创建Go项目,并且在国内,可以通过 GOPROXY 配置镜像源加速依赖包的下载。也就是说,创建一个项目就是一个mod,基本上目前Go开源项目都是这样做的。其实就是类似于Maven和Gradle。
// 创建mod项目,也是可以用IDE来new一个mod项目的:
go mod init calc-mod
// 一般开源在github上面的项目名字是这样的;和maven、gradle不一样的是,开发完成根本不需要发布到仓库!只要提交代码后打tag就可以了
go mod init github.com/fuxing-repo/fuxing-module-name
// 创建一个模块:执行这个命令主要是多了一个go.mod文件,里面就一行内容:
module calc-mod
// import以后,执行下载依赖命令,不需要编辑go.mod文件。依赖会下载到GOPATH/pkg/mod目录
go list
用GoLand来打开不同的项目,显示依赖的外部库是不一样的,如果是用GOPATH创建的项目,需要用命令下载依赖包到GOPATH:
go get -u github.com/fuxing-repo/fuxing-module-name
四 语法
1 包:Package 和 Import
Java里面的包名一般是很长的,和文件夹名称对应,作用就是命名空间,引入的时候需要写长长的一串,也可以用通配符:
Go里面一般的包名是当前的文件夹名称,同一个项目里面,可以存在同样的包名,如果同时都需要引用同样包名的时候,就可以用alias区分,类似于JS那样。一般import的是一个包,不像Java那样import具体的类。同一个包内,不同文件,但是里面的东西是可以使用的,不需要import。这有点类似于C的include吧。如果多行的话,用括号换行包起来。
Go语言中,无论是变量、函数还是类属性及方法,它们的可见性都是与包相关联的,而不是类似Java那样,类属性和方法的可见性封装在对应的类中,然后通过 private、protected 和 public 这些关键字来描述其可见性,Go语言没有这些关键字,和变量和函数一样,对应Go语言的自定义类来说,属性和方法的可见性根据其首字母大小写来决定,如果属性名或方法名首字母大写,则可以在其他包中直接访问这些属性和方法,否则只能在包内访问,所以Go语言中的可见性都是包一级的,而不是类一级的。
在Java里面,只有静态,或者对象就可以使用点运算符,而且是极其常用的操作,而在Go里面,还可以用一个包名来点,这就是结合了import来使用,可以点出一个函数调用,也可以点出一个结构体,一个接口。另外区别于C,不管是指针地址,还是对象引用,都是用点运算符,不需要考虑用点还是箭头了!
