golang开发工程师-第一步:golang入门基础教学

时间:2024-10-10 11:03:28

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