目录
1.开端
1.1 Go的学习方向
1.区块链工程师
区块链:区块链是一种带有数据“散列验证”功能的数据库。区块,就是数据块,按照时间顺序将数据区块组合成一种链式结构,并利用密码学算法,以分布式记账的方式,集体维护数据库的可靠性。所有数据块按时间顺序相连,从而形成区块链。
2.Go服务器端/游戏软件工程师
3.Golang分布式/云计算软件工程师
1.2 Go的“hello world!”程序
我的第一段go代码,我要从此刻开始码go了,2021年3月11日14:57:15!
package main
import "fmt"
func main(){
fmt.Println("hello,world!")
}
//说明:1,go文件后缀为.go
//2,package main表示hello.go文件所在的包是main(每个文件都必须属于一个包)
//3,import "fmt"表示引入一个包,其包名为"fmt"(为了使用包内的函数)[类似C的include?]
//4,func main()[ func为关键字,表示后面是一个函数,main为主函数,程序的入口
//5,fmt.Println表示调用fmt包内的函数Println输出"hello,world!”
//6,通过go build命令对该go文件进行编译,输出.exe文件
//7,执行结果:
/*
GOPATH=C:\Users\lenovo\go #gosetup
E:\Go\bin\go.exe build -o C:\Users\lenovo\AppData\Local\Temp\___go_build_hello_go.exe E:/Coding/go_project/src/go_code/project01/main/hello.go #gosetup
C:\Users\lenovo\AppData\Local\Temp\___go_build_hello_go.exe #gosetup
hello,world!
Process finished with exit code 0
*/
1.3语言特色/使用技巧
1.go语言的代码末不需要加上分号,系统会默认加上
2.引入多个包时可以一个个引:
import “fmt”
import “unsafe”
但最好用更专业的引入方法:
import(
“fmt”
“unsafe”
)
注: 在一个包前面加上_表示忽略该包,适用于用不到包却又不想删去的情况
它的本质是:让Go语言对包做初始化操作,但是不使用包内的标识符(即如果在包内存在init函数时调用该函数)
1.保小不保大,go语言尽量用合适大小的变量
例如,年龄变量最好用byte(byte0-255范围足够包括年龄可能的范围),而非使用int
2.Go语言要求可执行程序必须位于main包中,且需要在main包中找到main函数,把它作为程序的入口
3.任何包中如果存在func init函数,即是包中存在main函数且main函数中没有调用init函数,编译器在导入包时/执行main函数前都会先自动调用init函数(注:init函数要在main函数之前声明)
1.4相关英文单词
overflow 溢出(内存溢出)
omit 省略,删除
assignment 任务,指派
syntax 句法(语法)
index 索引
prefix 前缀
suffix 后缀
field 字段
stdout 标准输出
stderr 标准错误
2.变量(variable)
2.1变量声明(变量定义)
单变量定义:
法1:var i int = 10(定义了一个初值为10的int类型的变量i)
法2:var f = 10.11(省略数据类型,会智能根据赋值的数据选择类型)
法3:name := “tom”(可以省略var而用:=,此符号代表定义并赋初值)
多变量定义:(不同类型智能定义)
var i,name,j = 10,”tom”,10.11
或(同类型多个定义)
var i,j,k int
不可以(不同类型多个定义)
var i,name,j int,string,int
2.3 数据类型
1.基本数据类型
(1).整数类型
int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,byte
int后面带的数字为占用存储空间的bit,例如int8为一个字节
uint为无符号整型
(2).字符型
没有专门的字符型,用byte保存单个字符
(3).布尔型
bool
(4).字符串
string
(5).浮点型
float32,float64
2.复杂数据类型
(1)指针
(2)数组
(3)结构体
(4)管道
(5)函数
(6)切片
(7)接口
(8)map
2.2注意事项
1.若不赋初值:
int,float类型默认为 0
string类型默认为 ”” 空字符串
bool类型默认为false
2.go中的加号:(+)
(1)左右两边为数值型,做加法运算
(2)左右两边为字符串,做字符串拼接
2.4查看一个变量的数据类型和占用字节数
printf(“数据类型为:%T,占用字节数为:%d”,n,unsafe.sizeof(n))
注:
1.unsafe为一个包,sizeof为该包内函数
2.go语言严格区分大小写,%T的T一定要大写
2.5浮点型
浮点型形式:
1, 1.11十进制正常形式
2, .123 十进制省略0形式
3, 5.12e-2 等价于0.0512 科学计数法形式
2.6字符类型
1.go中若要存储单个字符,推荐使用byte类型,例如 var i byte = ‘a’
2.若要存储中文字符,则无法使用byte,会出现溢出,但是可以如下使用
func main() {
var i int = '嚄'
fmt.Printf("%c,%d",i,i)
}
即可以用%c输出某数字对应unicode编码下的字符
常识:go语言使用UTF-8编码,英文字母一个字符,汉字三个字符
3.go的字符串与传统的字符串不同,传统的字符串由字符组成,go则是由字节组成
4.若直接输出byte值,则输出的为ascII码值
5.字符类型可以进行运算,按其对应码值进行运算
2.7布尔类型
1.布尔类型只允许取值true和false(是的,不是0和1,而是true和false)
2.在空间中占用一个字节
3.默认值为false
2.8字符串类型
1.go的字符串并非由单个字符拼接而成,而是由单个字节拼接而成
2.字符串一旦赋值了,在go语言就不能更改字符串中单独的某一个字符了,要改需要整体进行更改
3.除了双引号””,反引号也可以用于输出字符串` `,且是以原生输出(不识别特殊字符,例如\n)的方式输出
例如,可以将源代码用反引号括起来,有时候会很方便且可以防止攻击
4.字符串拼接方式:“+”号,当拼接操作很长的时候,可以换行处理,但是一定要把+留在上一行(go看到+则不会默认加上分号)
2.9变量值输出方式
例:
var i int
var j float32
var k float64
var right bool
var story string
fmt.Println(i,j,k,right,story)[法一]
fmt.Printf("%d,%f,%f,%v,%v",i,j,k,right,story)[法二]
%v 表示按照值的默认的格式输出
2.10基本数据类型的转换
-> 与C语言不同,go的不同类型变量之间赋值时需要显示转换,即go中数据类型不能自动转换
基本语法:
表达式T(v)将值v转换为类型T
注:T就是转换后数据类型,例如:int32,float64等
v就是需要转换的变量
例:
var i int = 100;
若希望将i转换为float类型
错误转换法: var n1 float32 = i
正确转换法: var n2 (float32) = float32(i) [前float32可有可无]
ps:
一些其他语言 var n3 int8 = i是可以的,语言会判定由高精度转低精度
但这种情况go也不行,还是需要用到上述转换方式:
var n4 (int8) = int8(i)
一些细节注意:
1,go中可以将表示范围小的数据类型转换为大的,反之也可以转换
2,被转换的是变量存储的数据(值),变量本身的数据类型并没有变换(上方例子中i仍是int类型)
3,在转换中,比如将int64转换为int8,编译时不会报错,只是转换的结果有时候会按溢出处理,可能和我们想要的结果不太一样
3(拓展):
var i int32 = 10
var n3 int8 = 127 + int8(i) 结果:可通过编译,但是会造成溢出
var n4 int8 = 128 + int8(i) 结果:不可通过编译,因为128已超出int8的范围
2.11基本数据类型转string类型
法一: fmt.Sprintf(“%参数”,表达式)[效率低]
注:%参数的依据为被转换为string的数据类型对应的参数
例:
var num1 int = 99
var str string
str = fmt.Sprintf(“%d”,num1)
fmt.Printf(“str type is %T str = %v”,str,str)
法二:使用strconv包的函数
func FormatBool(b bool) string