建立一个文件(我的第一个文件是hellow.go),后在终端执行一下几步:我用的是go build先编译成了可执行文件(.exe)【1.go build hellow.go 2.hellow.exe】。当然,你也可以用go run直接运行【go run hellow.go】,本质过程是一样的。【.exe文件可以在其他电脑上跑(因为编译器将程序运行的库文件包含在可执行文件中),但是.go的文件不可以。】
就可以在处理窗口(第二排)看到执行结果了。
运行的快捷方式:1.在路径出口清除路径后输入cmd会直接跳转
2.
如果程序没有错误,就不会有任何提示,会在当前目录下生成一个可执行文件(win:.exe linux和mac是二进制文件)如果程序有错误,那么会在编译时报错。
cd .. 返回上一级
------------------
修改字体:文件->首选项->设置->定位到你要修改的地方的左边的笔,在右边直接修改对应的参数【机器会用】你改的覆盖原指令。
Go语言的注意事项:
1.文件后缀必须是.go
2.Go的执行入口是:main()函数
3.Go严格区分大小写
4.Go的每个语句后不需要加分号(;),简洁性
5.一行代码只能写一行语句
6.Go语言中定义的变量或者import的包如果没有使用,代码不能通过。【因为在做项目和工程时,需要不止一个人,如果变量不用的话,对接你的代码的人也不敢乱删,所以就会造成浪费】
7.大括号是成对出现的,缺一不可
----------------------------
Go的转移字符:\t \n \\:输出一个\,第一个\作为转移符号 \":输出一个" \r:回车,注意和想象的有点不一样!!真实的情况是这样的:
原理解释:先输出ABCD,回车:不换行,并且用\r后面的 覆盖前面的内容
------------
在有包(多半是main包)重复的情况下,可以直接拖动对应文件到其他文件夹下面,如果编译还是过不去,大概率是因为处理器还是在描述刚刚的错误【(*^_^*)】,你可以这个时候稍微 动一下内容,变一点无伤大雅的改动啦。{20节}
Golang开发常见的错误和解决方法:
1.The system cannot find the file specified. 原因:系统找不到可执行的文件
2."xxx"不是内部或外部命令,也不是可运行的程序或批处理文件。 原因:文件名不存在或写错,或者当前路径错误。
3.语法错误:不好区分字母,长得像(1和l );方法:去读编译器的报错
----------Go语言的注释:提高代码的可读性(方便自己和别人读)两种:1.// 2./* */ 【里面不要嵌套/**/,逻辑上会有错误】
-----------------快捷键:
ctrl+\:对选中的对应行全部加上// 的行注释,第二次就可以取消注释了
shift+alt+向下键:向下复制这一行代码
shift+tab:向左移 tab:向右移
-----------------Go规范的代码风格:
1.尽量使用行注释
2.正确的缩进和空白:
gofmt:在cmd里面使用 -w 以后才能让文件格式化,不然只是屏幕上面格式化了。
3.运算符两边各加一个空格:比如: 2 + 4 * 5 这样
4.代码不可以这样写:设计者规定代码风格要统一,思想:一个问题一个解决方法
func main()
{
xxxx
}
正确的:
func main(){
xxxx
}
5.行长规定:一行最长不要超过80个字符,(超过请换行),尽量保持格式优雅,可以在Printin里面过长的地方加",然后再换行。如:
变成这样:
但是屏幕里面这样不会有换行效果。
是这样子的:
Golang的API文档:中文网网址:Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 (studygolang.com)
包:就是电脑上的一个一个文件夹。
调用函数的方式 :import 包名
dos的常用指令:(4条消息) DOS的常用指令:_薄荷糖yh的博客-CSDN博客
回顾文件的使用流程:
hhh
定义一个变量:%v可以输出
匿名变量:不需要名字,—【下划线】,return 【xx】
注意事项:
变量使用方式:
1.指定变量类型,不赋值【变量为默认值 eg:int的默认值为0】
2.根据值自行判断变量类型(类型推导)【动态编程的特点】
eg:var num=10.32 这个num就是小数类型
3.省略var,【特色】变成了这样 变量 := 【赋值】,冒号不省,否则是赋值
4.多变量声明:eg: var v1,v2,v3 fmt.Println("n1=",n1,"n2=",n2,"n3=",n3) 最后就会输出三个零了。
当变量不一样: var n1, name, n3 = 100, "tom" ,888 最后输出100,tom,888
当然,对多变量的类型推导: n1, name, n3 := 100, "tom" ,888
全局变量【函数外部】的多函数:go里面的全局变量在定义的时候不可以过于省略,必须写关键字 var
var(
n1=100
n4=56
)
变量在对应生命区域可以在同一类型不断变化【会出现红色波浪线】
变量如果一开始没有赋值,就使用默认值。【eg:int=0;小数=0;string为空串】
变量基本语法:var 变量名 数据类型 【var i int var num float】
变量初始化[声明时赋值]:var i = 10 可以不用写类型了,自己数据推导
" + "的使用:1.左右两边都是数值类型:进行加法运算 2.两边都是字符串类型:进行字符串拼接。
如果你要混合定义很多个变量的话:var (
name = "alex"
age = 19
salary = 80000.00
hobby string
)
当int bool string这三种类型进行变量赋值操作时,go会赋值原来的值【新地址】,这是值类型引用
name变量的值内容若改变, 它的地址还是不改。
常量
1.【定义常量:const a int = 18】a := 18 只能定义变量。常量在定义的时候必须一起赋值。
const a int 是错误的,定义域和变量差不多,多半用于全局 多个常量赋值也可以这样:
const(
v1=18.2
v2=34
)
最后都fmt.Println(v1,v2,v3)
2.iota(计数器,可被修改的常量)
const(
v1 = iota
v2
v3
)
的效果等同于
const(
v1 = 0
v2 = 1
v3 = 2
)
如果想让开头的值不为0,可以v1 = iota+1 操作;‘如果中间想要跳过一个值的话可以定义一个不用的变量【匿名变量】
const(
v1=iota
_ //这是一个下划线开头的变量,最后没有输出它
v2
v3
)
iota每生成一个常量就加一,无论用不用的上:
const(
v1 = iota
v2=100
v3=iota
) 最后输出的是0 100 2
数据类型介绍:
(一)基本数据类型
1.数值型:
1.1整数型:int int8【8位的int相当于一个byte,可以表示的范围是 -128-127 {-2^7 -- 2^7 有一个空的符号位 }】int16 int32【4个字节】 int64
1.2浮点数:float32【4字节】 float64 {unint表示无符号的int,范围:0到2^8,没有负数了}
2.字符型【文本】:没有专门的字符型,用byte来表示单个字母字符(不是汉字,按照编码规定,一个汉字三个字节)
3.bool(布尔类型):只有true和false两种类型,也可以用于判断条件。多用于if 循环 条件表达式等 0和1不能表示bool类型,在go里面
4.字符串(string)【[] byte】:go归为基本数据类型 {java归为复杂数据类型}
字符串的反引号换行:
s4 := `
xxx
`
字符串的连接:1.加号 2.fmt.Printf("%s,%s",a1,a2)//URL里面拼一个URL
3.a1 := "hhhh" a2 := "aaaa" s:=strings.Join([ ].string{a1,a2}," , ") //join:连接 fmt.Printf("s= %v\n",s)
4.用buffer直接写到缓冲区
var buffer bytes.Buffer
buffer.WriteString("tom")
buffer.WriteString(",")
buffer.WriteString("20")
fmt.Printf("%v \n",buffer.String())
注:rune==int32 //int的别名,表示一个Unicode码点,可以存汉字。
5.进制:%b %d o开头表示输入8进制 (%o输出) ox表示16进制(%X或 %x,输出大小写的区别)
6.复数(实部与虚部)var a complex a = 1 + 2i
(二)复杂数据类型
1.指针 2.数组 3.结构体 4.管道:Channel,多并发 5.函数
6.切片 7.接口 8.map:有点像集合
切片操作:
str := "hello world"
n:=3
m := 5
fmt.Println(str[n]) //获取字符串索引位置为n的原始字节
fmt.Println(str[n:]) //截取得字符串索引位置为 n 到 m-1 的字符串fmt.PrintIn(str[n:]) //截取得字符串索引位置为 n 到 len(s)-1 的字符串
fmt.PrintIn(str[:m]) //截取得字符串索引位置为 到 m-1 的字符串
常用函数:len(i) //查看字符串长度
strings.Spit(s," ") //第二个参数是 一个空格,把字符串分割成数组[xxxxxxx]
strings.Contains(s," ")//是否包含某一个字符串,返回bool类型【布尔】
strings.Hasprefix(s,"字符串输入前缀")//判断前缀大小写,小写返回true
strings.HasSuffer(s,"字符串输入后缀")//判断前缀大小写,小写返回true
strings.Tolower(s) //把字符串全改成小写
strings.ToUpper(s) //把字符串全改成大写
strings.index(s,"xxx") //找到""里面的位置第i个位置
strings.Lastindex(s,"xxx") //找到""里面的位置第i个位置
输入:
fmt.Scan:必须要把里面的所有值都得到才会继续走
fmt.Scanln:只等待回车,可以不输完要求的值
fmt.Scanf:可以输入固定的模板(像c那样),但是%s这样的格式化字符的时候,必须打一个空格作为分界【分界不明显】
这三个函数都有返回值:count error。可以打印出来,帮助验证函数。
但是他们不能解决的问题:用户输入较多也有空格要读【不容易区分边界】
方法:系统的输入输出
reader := bufio.NewReader(os.Stdin) //rangreader去os.Stdin里面去读用户输入内容
line , isPrefix , error := reader.ReaderLine() //ReaderLine表示reader从里面读一行(大概4096字节)
data := string(line) //把line转化成字符串
fmt.Println(data)
注:isPrefix 是标志,如果一次性没有读完,那么Prefix=true,再去读取,只有在读完的瞬间才是false 别搞错了!!
条件语句:
1.基本 eg:
if age==1 { //与c只有不加括号的区别
。。。。
}else{
。。
}
2.多条件判断
if age==1 { //与c也只有不加括号的区别
}else if 条件1{
}else if 条件2{
}else{
}
3.嵌套
if xx{
if xx {
}
}
注意:嵌套不要太多!!!!会啰嗦且无效率
switch case
与c相比,也仅仅是无括号 :
switch xx {
case 1:
case 2:
default:
}
for:4种形式
1.死循环 for {
fmt.Println("开心开心")
time.Sleep(time,Second * 1) //在运行到这里的时候会停一秒
}
2.有条件的循环 for age==1【条件块】 {
xxxx
}
条件块可以是变量,但是必须是bool类型
flage := 1
for flage{
xxx
} 这是错的,改成
flage := true
for flage{
xxx
} 是对的
3.声明变量加条件
for i:=1 ; i<10 ; {
xxx
i++
}
改良
for i:=1 ; i<10 ;i = i + 2 { //也是c没有加括号
xxx
}
关键字:
break continue 也在
但是go里面有一个打标签:对for进行打标签,然后通过break和continue就可以实现多层循环的终止
f1 :for i:=1 ; i<3 ; i++{
for j:=1 ; j<5 ; j++ {
if j==3 {
continue f1; //continue现在表示停止f1这一次循环了
}
}
}
最终输出结果:
1 1 1 2 2 1 2 2
f1 :for i:=1 ; i<3 ; i++{
for j:=1 ; j<5 ; j++ {
if j==3 {
break f1; //continue现在表示停止f1这一次循环了
}
}
}
最终输出结果:
for range循环,
数组和切片返回 索引和值
数组: a := [5]int{1,2,3} 切片 :动态数组: s := [ ]int{1,2,3,4}
map返回 键key和值value
m := make(map[string]string,0)
m["name"] = "tom" m["age"] = "20"
for key,value := range m{
fmt.Print("%v:%v ",key,value)
}
最后输出结果:name:tom age:20
通道,返回通道值:用于处理数据并发
range就像一个函数,有返回值,【索引和值或者 键和值】可以让返回值在for循环里面表示出来。
func Hell()string{
}
这个函数(Hell)的返回值就是string
%T可以格式化输出对应变量类型 %v输出值(value)
大写共有,小写私有
******************依赖管理***************
"go modules"