golang入门基础教学
- 前言
- 一、golang的优势何在?
- 二、goland破解教程
- 三、goland的使用教程
- 四、一个简单的go代码
- 五、变量的声明和赋值
- 六、数据类型的基本介绍
- 七、访问权限【公开、私有】
- 八、程序流程控制语句
- 九、函数、包和错误处理
- 十、数组与切片
- 十一、map【键值对】
- 十二、结构体
- 十三、封装、继承、多态
- 十四、总结
前言
人生格言:好记性不如烂笔头!
建议:看这篇文章,前提是必须会java,javascript等一门语言。你可以把golang语言看做是缝合怪;集c,java,javascript等语言优点于一身。如果你没有任何编程语言傍身,本人还是建议你去哔站看视频,就不要在这里浪费时间了~~~
一、golang的优势何在?
优势一:golang代码很简洁,很优雅。先给大家看一个由golang编写的网页(如下);用少许代码去写出一个网页,java等语言办不到!【但是golang的缺点也很明显:代码太简洁,看不懂了。这个因人而异吧】
main包
package main
import(
"/gin-gonic/gin"
"net/http"
)
func main() {
//创建一个路由引擎
server := gin.Default()
//加载静态页面
//全局加载 路由引擎.LoadHTMLGlob("指定的静态页面路径")
server.LoadHTMLFiles("demo02/template/")
//加载静态资源
//()
//响应
server.GET("/index", func(context *gin.Context) {
context.HTML(http.StatusOK,"",gin.H{
"message":"golang语言,我来了!",
})
})
//启动
server.Run()
demo02/template/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>golang</title>
</head>
<body>
<h1>{
{.message}}</h1>
</body>
</html>
输入url:127.0.0.1:8080/index
效果如下:
优势二:golang编写的服务器启动很快!java的springBoot框架的内置服务器启动就很慢。
优势三:golang运行代码,生成的是文件。只要有这个文件,就可以在任意一台电脑上运行,即:跨平台。这个时候就有人说了:java不也是垮平台吗?注意:java是依据JVM的不同才实现的跨平台特性。golang生成的文件,可以在不同的操作系统下直接调用Linux内核去执行代码。【Linux内核是所有操作系统的基层】
二、goland破解教程
goland、VScode等软件是开发go语言的平台。本文就使用goland去开发go。
goland正版是要钱的,我这里能破解2020.1版本的goland【这个版本相对是老版本了,将就用吧】
百度网盘URL:/s/173QIlv6KrSGzsWwwJfXp4A
提取码:hang
期限:永久有效
这个是2020.1版本的goland应用程序,双击点开即可。安装看其他博主教程。
打开过后选择试用,进入goland工作台
然后将Crack/文件丢入该goland工作台。
如果你想使用汉化版,就将resources_zh_CN_GoLand_2020_r1.jar文件也丢入该工作台
然后,重启goland。就破解完毕了
三、goland的使用教程
配置主题
这个主题,我觉得好看一些。看着也不伤眼睛。主题选择,你可以随便搞
配置go语言的源库SDK
跟java一样。go语言也有源库。为什么我要在这里才说源库呢?因为goland可以帮我们去拉取源库
配置工作空间
配置go-modules
go-modules是什么呢?它就类似于java的Maven仓库。比如,你以后要使用gin框架,你就必须去拉取gin框架的源码。放在哪里呢?就放在go-modules中
goland的基本必要的配置就这些。至于字体什么的,就自己去调。挺简单的。如果我说的不明白,就去看看别的文章。勿恼!
四、一个简单的go代码
package main
import "fmt"
func main() {
fmt.Println("golang ,I am coming!")
}
一个go函数必须归属于一个包;main()必须归属于package main 【main包】
main()是一个go程序的入口
fmt是go语言自带的标准库内的包
(“golang ,I am coming!”) 是调用了fmt包内的Println()【P是大写的】
golang标准库文档
五、变量的声明和赋值
接下来开始,我们就学习golang的基础语法了。挺简单的。
任何一个编程语言,都必须有变量。可以说,变量是编程语言的基础
怎么理解变量呢?
举个例子:现在你身上有棒棒糖,而你在一家酒店的888号房间。888是变量??不对的。888号是地址,是你所待的空间的地址。你才是变量。棒棒糖是变量值。就好比:a = 棒棒糖 ;获得棒棒糖的方式有两种。一是访问你,二是访问那处空间地址。即指针的概念。
变量的步骤有三个:【适用于所有的编程语言】
声明变量 ----赋值 -----使用变量
代码如下:
package main
import "fmt"
func main() {
//第一种创建变量的方式:声明 赋值 分开操作
//声明,int 是声明变量的数据类型
var number int
//赋值【若不给变量赋值,该变量是使用默认值 0 , "" , false】
number = 10
//第二种:声明和赋值一起
var name string = "王麻子"
//第三种:简写
//这种就是把 var == : ;略写数据类型了,由系统去判断什么类型的
age := 23
//使用
fmt.Printf("number = %d,name = %s,age = %d \nnumber变量的地址==>%d",number,name,age,&number)
}
这里指针的概念,我就提一嘴。以后讲到指针会详细说的
变量声明了就必须使用,不然报错。
作业:判断一个变量只声明而不赋值,会不会使用默认值?int ,string ,bool 类型的默认值是什么?
多个变量的批量声明和赋值
package main
import "fmt"
//声明全局变量 在函数外部,必须有 var func const 关键字修饰,即:不能使用 number := 23
//单个
var number = 23
//批量
var(
name = "行者"
age = 23
city = "北京"
)
func main() {
// 声明局部变量
name,age,city := "王麻子",12,"重庆"
// 问:如果在全局变量和局部变量中,有相同变量名时,函数会使用哪一个?
fmt.Printf("name = %v,age = %v , city = %v",name,age,city)
}
函数内部会优先使用该函数内部的局部变量。
变量在同一作用域内是不能重名的。
变量 = 变量名 + 变量值 + 数据类型
程序中 + 号运算符的使用
如果两个数据类型均为int的变量相加,结果会如何?
如果两个数据类型均为string的变量相加,结果会如何?
如果一个string类型的变量去加一个int类型的变量呢?
package main
import "fmt"
var (
num01 = 20
num02 = 10
str01 = "com"
str02 = "ing"
str03 = "30"
)
func main() {
// 两个数据类型均为int的变量相加
first := num01 + num02
// 两个数据类型均为string的变量相加
second := str01 + str02
// 一个string类型的变量去加一个int类型的变量 string(num01) 将num01的int数据类型强制转换为 string类型
three := str01 + string(num01)
fmt.Printf("first = %v,second = %v,three = %v",first,second,three)
}
六、数据类型的基本介绍
int数据类型【存放整数的】
package main
import (
"fmt"
)
func main() {
// int8 1字节空间大小 -128~~127
var small int8 = 126
// int16 2字节
var model int16 = 200
// int32 4字节 本机的操作系统如果是32位的,你写 var number int 就是声明; number的类型为 int32
var num32 int32 = 500
// int64 8字节 本机的操作系统如果是64位的,你写 var num int 就是声明; number的类型为 int64
var num64 int64 = 8000
// uint8 、 uint16 、 uint32、uint64 这个是无符号的int类型,即:非负数
// uint8一般用于年龄的数据类型
var age uint8 = 99
fmt.Printf("int8 ==> %d,int16 ==> %d,int32 ==> %d,int64 ==> %d,uint8 ==> %d",small,model,num32,num64,age)
}
Golang 程序中整型变量在使用时,遵守保小不保大的原则,即:在保证程序正确运行下,尽量
使用占用空间小的数据类型
小数类型【浮点数类型float32\float64】
number := 1.222222 这个变量的类型是float32?还是float64?
package main
import "fmt"
import "unsafe"
func main() {
number := 1.22222
fmt.Printf("number的类型是:%T,nnumber的字节长度是:%d个字节",number,unsafe.Sizeof(number))
}
(number) 是unasfe包下的Sizeof()函数的调用。查看指定变量类型的字节长度
字符类型
Golang 中没有专门的字符类型,如果要存储单个字符(字母),一般使用 byte 来保存。
字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。
问题:我能不能以一个字节为单位去遍历带有汉字的字符串?
package main
import "fmt"
func main() {
str := "我来北京打工m,coming!"
for i:=0;i<len(str);i++{
fmt.Printf("第%d个下标的值为:%c \n",i,str[i])
}
}
可以看出:乱码问题!为什么会乱码?
在go的字符串中,遵循 UTF-8编码方案,一个汉字是由三个字节包括,一个字母是由一个字节包括。你一个字节一个字节的遍历,肯定会出现乱码问题。
解决方案:以三个字节为单位去遍历字符串
package main
import "fmt"
func main() {
str := "我来北京打工m,coming!"
for index,value := range str{
fmt.Printf("第%d的下标的值为:%c \n",index,value)
}
}
for index,value := range str{} 是go特有的range遍历。其本质就是以三个字节为单位的遍历方式
布尔类型 bool
package main
import (
"fmt"
"unsafe"
)
func main() {
var bo bool = false
fmt.Printf("bo的类型为:%T,bo的字节长度为:%d",bo,unsafe.Sizeof(bo))
}
字符串string类型
package main
import (
"fmt"
)
func main() {
str := "hang"
//不能使用 str[0] = a 去修改str中的值
//1.将str转换为 []uint8
by := []byte(str)
//2.修改by中的元素值
by[0] = 'a'
//3.将by的[]uint8数据类型转换为string
str = string(by)
fmt.Printf("str的值为:%s ,by的数据类型为:%T",str,by)
}
go语言有个特性:在每行代码的末尾会自动添加分号 ;
基本数据类型的相互转换
Go 在不同类型的变量之间赋值时需要显式转换。也就是说 Golang 中数
据类型不能自动转换。表达式 T(v) 将值 v 转换为类型 T
Go 中,数据类型的转换可以是从 表示范围小–>表示范围大,也可以 范围大—>范围小
在转换中,比如将 int64 转成 int8 【-128—127】 ,编译时不会报错,只是转换的结果是按
溢出处理,和我们希望的结果不一样。
基本数据类型转换为string类型
package main
import (
"fmt"
"strconv"
)
var (
intTest = 12
floatTest = 12.22
boolTest