golang基础之初识
golang 简介
很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目。在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括庞大的分布式集群,大牛觉得很闹心,后来c++委员会来他们公司演讲,说c++将要添加大概35种新特性。这几个大牛的其中一个人,名为:Rob Pike,听后心中一万个xxx飘过,“c++特性还不够多吗?简化c++应该更有成就感吧”。于是乎,Rob Pike和其他几个大牛讨论了一下,怎么解决这个问题,过了一会,Rob Pike说要不我们自己搞个语言吧,名字叫“go”,非常简短,容易拼写。其他几位大牛就说好啊,然后他们找了块白板,在上面写下希望能有哪些功能(详见文尾)。接下来的时间里,大牛们开心的讨论设计这门语言的特性,经过漫长的岁月,他们决定,以c语言为原型,以及借鉴其他语言的一些特性,来解放程序员,解放自己,然后在2009年,go语言诞生。
思想
Less can be more 大道至简,小而蕴真 让事情变得复杂很容易,让事情变得简单才难 深刻的工程文化
优点
- 自带gc。
- 静态编译,编译好后,扔服务器直接运行。
- 简单的思想,没有继承,多态,类等。
- 丰富的库和详细的开发文档。
- 语法层支持并发,和拥有同步并发的channel类型,使并发开发变得非常方便。
- 简洁的语法,提高开发效率,同时提高代码的阅读性和可维护性。
- 超级简单的交叉编译,仅需更改环境变量。(花了我两天时间编译一个imagemagick到arm平台)
- 内含完善、全面的软件工程工具。Go语言自带的命令和工具相当地强大。通过它们,我们可以很轻松地完成
- Go语言程序的获取、编译、测试、安装、运行、运行分析等一系列工作,这几乎涉及了开发和维护一个软件的所有环节。
Go 语言是谷歌 2009 年首次推出并在 2012 年正式发布的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去10多年间软件开发的难度令人沮丧。Google 对 Go 寄予厚望,其设计是让软件充分发挥多核心处理器同步多工的优点,并可解决面向对象程序设计的麻烦。它具有现代的程序语言特色,如垃圾回收,帮助开发者处理琐碎但重要的内存管理问题。Go 的速度也非常快,几乎和 C 或 C++ 程序一样快,且能够快速开发应用程序。
Go语言的主要特征:
- 自动立即回收。
- 更丰富的内置类型。
- 函数多返回值。
- 错误处理。
- 匿名函数和闭包。
- 类型和接口。
- 并发编程。
- 反射。
- 语言交互性。
Golang文件名:
所有的go源码都是以 ".go" 结尾。
Go语言命名:
1.Go的函数、变量、常量、自定义类型、包(package)
的命名方式遵循以下规则:
1)首字符可以是任意的Unicode字符或者下划线2)剩余字符可以是Unicode字符、下划线、数字3)字符长度不限
2.Go只有25个关键字
break default func interface selectcase defer go map structchan else goto package switchconst fallthrough if range typecontinue for import return var
3.Go还有37个保留字
Constants: true false iota nilTypes: int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptrfloat32 float64 complex128 complex64bool byte rune string errorFunctions: make len cap new append copy close deletecomplex real imagpanic recover
4.可见性:
1)声明在函数内部,是函数的本地值,类似private2)声明在函数外部,是对当前包可见(包内所有.go文件都可见)的全局值,类似protect3)声明在函数外部且首字母大写是所有包可见的全局值,类似public
Go语言声明:
有四种主要声明方式:
var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)。
Go的程序是保存在多个.go文件中,文件的第一行就是package XXX声明,用来说明该文件属于哪个包(package),package声明下来就是import声明,再下来是类型,变量,常量,函数的声明。
Go项目构建及编译
一个Go工程中主要包含以下三个目录:
src:源代码文件
pkg:包文件
bin:相关bin文件
1: 建立工程文件夹 goproject
2: 在工程文件夹中建立src,pkg,bin文件夹
3: 在GOPATH中添加projiect路径 例 e:/goproject
4: 如工程中有自己的包examplepackage,那在src文件夹下建立以包名命名的文件夹 例 examplepackage
5:在src文件夹下编写主程序代码代码 goproject.go
6:在examplepackage文件夹中编写 examplepackage.go 和 包测试文件 examplepackage_test.go
7:编译调试包
go build examplepackage
go test examplepackage
go install examplepackage
这时在pkg文件夹中可以发现会有一个相应的操作系统文件夹如windows_386z, 在这个文件夹中会有examplepackage文件夹,在该文件中有examplepackage.a文件
8:编译主程序
go build goproject.go
成功后会生成goproject.exe文件
至此一个Go工程编辑成功。
1.建立工程文件夹 go
$ pwd
/Users/***/Desktop/go
2: 在工程文件夹中建立src,pkg,bin文件夹
$ ls
bin conf pkg src
3: 在GOPATH中添加projiect路径
$ go env
GOPATH="/Users/liupengjie/Desktop/go"
4: 那在src文件夹下建立以自己的包 example 文件夹
$ cd src/
$ mkdir example
5:在src文件夹下编写主程序代码代码 goproject.go
6:在example文件夹中编写 example.go 和 包测试文件 example_test.goexample.go 写入如下代码:package examplefunc add(a, b int) int {return a + b}func sub(a, b int) int {return a - b}example_test.go 写入如下代码:package exampleimport ("testing")func TestAdd(t *testing.T) {r := add(2, 4)if r != 6 {t.Fatalf("add(2, 4) error, expect:%d, actual:%d", 6, r)}t.Logf("test add succ")}7:编译调试包$ go build example$ go test exampleok example 0.013s$ go install example$ ls /Users/***/Desktop/go/pkg/
darwin_amd64
$ ls /Users/***/Desktop/go/pkg/darwin_amd64/
example.a
8:编译主程序oproject.go 写入如下代码:package main import ("fmt")func main(){fmt.Println("go project test")}$ go build goproject.go$ lsexample goproject.go goproject成功后会生成goproject文件至此一个Go工程编辑成功。运行该文件:$ ./goprojectgo project test
go 编译问题
golang的编译使用命令 go build , go install;除非仅写一个main函数,否则还是准备好目录结构;
GOPATH=工程根目录;其下应创建src,pkg,bin目录,bin目录中用于生成可执行文件,pkg目录中用于生成.a文件;
golang中的import name,实际是到GOPATH中去寻找name.a, 使用时是该name.a的源码中生命的package 名字;这个在前面已经介绍过了。
注意点:
- 系统编译时 go install abc_name时,系统会到GOPATH的src目录中寻找abc_name目录,然后编译其下的go文件;
- 同一个目录中所有的go文件的package声明必须相同,所以main方法要单独放一个文件,否则在eclipse和liteide中都会报错;
编译报错如下:(假设test目录中有个main.go 和mymath.go,其中main.go声明package为main,mymath.go声明packag 为test);
$ go install test
can't load package: package test: found packages main (main.go) and test (mymath.go) in /home/wanjm/go/src/test
报错说 不能加载package test(这是命令行的参数),因为发现了两个package,分别时main.go 和 mymath.go; - 对于main方法,只能在bin目录下运行 go build path_tomain.go; 可以用-o参数指出输出文件名;
- 可以添加参数 go build -gcflags "-N -l" ****,可以更好的便于gdb;详细参见 http://golang.org/doc/gdb
- gdb全局变量主一点。 如有全局变量 a;则应写为 p 'main.a';注意但引号不可少;
golang内置类型和函数
- 内置类型: (值类型)
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
float32, float64
string
complex64, complex128
array -- 固定长度的数组
- 引用类型:(指针类型)
slice -- 序列数组(最常用)
map -- 映射
chan -- 管道
- 内置函数
Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用于系统级的操作,例如:panic。因此,它们需要直接获得编译器的支持。
append -- 用来追加元素到数组、slice中,返回修改后的数组、slice
close -- 主要用来关闭channel
delete -- 从map中删除key对应的value
panic -- 停止常规的goroutine (panic和recover:用来做错误处理)
recover -- 允许程序定义goroutine的panic动作
imag -- 返回complex的实部 (complex、real imag:用于创建和操作复数)
real -- 返回complex的虚部
make -- 用来分配内存,返回Type本身(只能应用于slice, map, channel)
new -- 用来分配内存,主要用来分配值类型,比如int、struct。返回指向Type的指针
cap -- capacity是容量的意思,用于返回某个类型的最大容量(只能用于切片和 map)
copy -- 用于复制和连接slice,返回复制的数目
len -- 来求长度,比如string、array、slice、map、channel ,返回长度
print、println -- 底层打印函数,在部署环境中建议使用 fmt 包
- 内置接口error
type error interface { //只要实现了Error()函数,返回值为String的都实现了err接口Error() String}
init
函数
go语言中init
函数用于包(package)
的初始化,该函数是go语言的一个重要特性。
有下面的特征:
1 init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等2 每个包可以拥有多个init函数3 包的每个源文件也可以拥有多个init函数4 同一个包中多个init函数的执行顺序go语言没有明确的定义(说明)5 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序6 init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
main
函数
Go语言程序的默认入口函数(主函数):func main()
函数体用{}一对括号包裹。func main(){//函数体
}
init
函数和main
函数的异同
相同点:两个函数在定义时不能有任何的参数和返回值,且Go程序自动调用。
不同点:init可以应用于任意包中,且可以重复定义多个。main函数只能用于main包中,且只能定义一个。
两个函数的执行顺序:
对同一个go文件的init()
调用顺序是从上到下的。
对同一个package
中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()
函数。
对于不同的package
,如果不相互依赖的话,按照main包中"先import的后调用"的顺序调用其包中的init()
,如果package
存在依赖,则先调用最早被依赖的package
中的init()
,最后调用main函数。
如果init函数中使用了println()
或者print()
你会发现在执行过程中这两个不会按照你想象中的顺序执行。这两个函数官方只推荐在测试环境中使用,对于正式环境不要使用。
欢迎您关注程序员同行者订阅号,程序员同行者是一个技术分享平台,主要是运维自动化开发:linux、python、django、saltstack、redis、golang、docker、kubernetes、vue等经验分享及经验交流。
趁现在,关注我们
牛人并不可怕,可怕的是牛人比我们还努力!
如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小编最好的支持,非常感谢!
转载于:https://www.cnblogs.com/guigujun/p/10876823.html
golang基础之初识相关推荐
- 万字Golang基础知识(肝爆三天三夜,手撕Golang基本语法结构)
Golang基础知识 一. 初识Golang 1.1 Go的语法要求 1.1.1 token 1.2 变量和常量 1.2.1 变量 1.2.2 常量 1.3 基本数据类型 1.3.1 布尔类型 1.3 ...
- golang基础-etcd介绍与使用、etcd存取值、etcd监测数据写入
关注公众号"风色年代"订阅更多精彩文章,本博大部分文章为转载并已标明原文出处,如有再转敬请保留,请自觉尊重原创作者的劳动成果! golang基础-etcd介绍与使用.etcd存取值 ...
- golang基础教程
目录 golang基础教程(一).环境搭建 golang基础教程(二).开发规范及API golang基础教程(三).变量与数据类型概述 golang基础教程(四).基本数据类型 golang基础教程 ...
- golang基础面试题总结
golang基础面试题总结 前言:由于正在准备之后的实习面试,故总结了一部分golang语言基础的问题,回答全为自己组织的语言,若有错各位大佬可及时指出,大家共同进步,谢谢. 1.go中怎样实现安全读 ...
- Go语言学习笔记—golang基础语法
视频来源:B站<golang入门到项目实战 [2022最新Go语言教程,没有废话,纯干货!]> 文章为自己整理的学习笔记,侵权即删,谢谢支持! 文章目录 golang基础语法 一.gola ...
- python定义一个dog类 类属性有名字_python 基础 12 初识类,类方法,类属性
python 基础 12 初识类,类方法,类属性 # 面向过程 : 想要一个结果 写代码 实现计算结果 # 面向对象开发 : 有哪些角色 角色的属性和技能 两个角色之间是如何交互的 # 复杂的 拥有开 ...
- 【三】零基础入门深度学习:卷积神经网络基础之初识卷积
(给机器学习算法与Python学习加星标,提升AI技能) 作者 | 孙高峰 百度深度学习技术平台部资深研发工程师 内容来源 | 百度飞桨深度学习集训营 本文转自飞桨PaddlePaddle 导读 百度 ...
- golang基础教程(十)、结构体
golang基础教程 一.Golang 语言面向对象编程说明 Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对 象语言.所以我们说 Golang 支持面向 ...
- 视频教程-桫哥-GOlang基础-01基本程序设计-Go语言
桫哥-GOlang基础-01基本程序设计 多年互联网从业经验: 有丰富的的企业网站.手游.APP开发经验: 曾担任上海益盟软件技术股份有限公司项目经理及产品经理: 参与项目有益盟私募工厂.睿妙影音家庭 ...
最新文章
- 网络推广外包——网络推广外包专员如何做好网站首页设计
- centos下查看网卡,主板,CPU,显卡,硬盘型号等硬件信息
- 详解java类的生命周期
- jbpm springboot mysql_SpringBoot开发案例之整合Activiti工作流引擎
- 荣耀50 Pro+配置参数曝光:AMOLED高刷屏+骁龙888旗舰芯片
- Python爬虫教程:简书文章的抓取与存储
- Struts2学习笔记(八) 拦截器(Interceptor)(上)
- docker from指令的含义_volume_from指令-docker撰写
- android5.1使用SerialManagerService
- Python_命名空间和作用域_25
- 快递物流行业如何用易语言对接验证码短信接口DEMO示例
- Ubuntu20.04、22.04安装nvidia显卡驱动
- 苹果电脑怎么读取ntfs磁盘?有哪些可以读取苹果电脑硬盘的软件?
- Apache OpenNlp的初探
- Google的垂直搜索
- 伯努利分布(二项分布)的假设检验
- 电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键
- echarts看板效果图:流光折线图、3d柱状图、3d饼图、3d地图
- Socket.io 聊天室(代码已开源)
- 操作系统知识点及题目
热门文章
- Socket 编程,一个服务器,多个客户端,互相通信
- 深度学习《Transfer Learning》
- 漫步最优化十二——局部极小与极大的充分必要条件(下)
- 不相干进程之间传递文件描述符
- Gamma函数(伽玛函数)的一阶导数、二阶导数公式推导及java程序
- 常用损失函数(Loss Function)
- OpenCV--图像内轮阔填充
- 机器学习笔记II: 决策树
- 小程序 - 参考数据 - ASC字符码表和常用的中文字符编码表
- 基类成员的public访问权限在派生类中变为_第17篇:C++继承中虚表的内存布局