个人简介:
> 个人主页:赵四司机
> 学习方向:JAVA后端开发
> 种一棵树最好的时间是十年前,其次是现在!
> ⏰往期文章:SpringBoot项目整合微信支付
> 喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。
前言:
最近发现Golang很火,而且他还是一款编译型语言,速度快,处理高并发能力强。抱着一颗好奇的心,我打算学一下Golang的一些基础知识拓宽一下自己的知识面,领会一下Go语言的神奇之处,假如后面需要用到Go语言也能更容易上手。俗话说好记性不如烂笔头,而且我本来就记性不怎么好,所以我学习喜欢做上笔记记录,这里我就将我的学习成果记录到Golang专栏里,自己以后复习也好翻阅,要是你也有兴趣学习Golang也可以查看我这个专栏的文章。
目录
一:走进Golang
1.Go语言简介
2.Go语言特点
3.Go语言应用领域
二:入门实操
1.Go代码组织
2.Go项目管理工具
3.入门案例
三:Golang变量
1.变量声明
2.变量赋值
3.匿名变量
四:Golang常量
1.常量定义
2.iota
五:Golang数据类型
1.布尔类型
2.数字类型
(1)不同进制格式定义数字
(2)浮点型
3.字符串类型
Go(又称Golang)是Google的Robert Griesemer,Pop Pike及Ken Thompson开发的一种静态强类型、编译型语言。Go语言语法与C相近,但是其功能更完备,具有内存安全、GC(垃圾回收)、结构形态及CSP-style并发计算等功能。
我们都知道Java得益于它的虚拟机可以实现一次编译到处运行,而Go也是支持跨平台运行的,经过了解原来是Go语言得益于它的模块化设计和模块化,针对不同平台都可以生成对应的二进制可执行机器码,他不需要依赖性,它的代码可以在任何服务器和应用程序上面运行。此外,Go语言拥有自己的链接器,不依赖任何系统提供的编译器和链接器。因此编译出的二进制可执行文件几乎可以运行在任何系统环境中。
Go语言使用包和模块来组织代码,包对应到文件系统里面就是文件夹,模块就是.go文件,一个包中会有多个模块,或者多个子包。
早期的Go项目使用gopath来管理项目,不方便使用而且易出错,从Golang 1.11开始使用gomod管理项目,当然还有第三方模块例如govendor,一般都是采用gomod较多。
①创建项目
在文件夹中新建一个文件夹作为项目根目录
②初始化项目
在项目根文件夹下打开终端执行go mod init xxx,xxx一般用你项目名称表示,比如我这里是go mod init gopro1,然后就会自动创建一个.mod文件。
③创建包及相应模块
在项目根目录下创建user包及user.go模块,模块内容见下图:
④相互调用
在项目根目录下创建main.go模块并编写下面代码进行调用:
⑤运行测试
在终端执行go run main.go
Go语言的变量声明和c或者java都不太一样,在java中我们声明变量是 数据类型 变量名,但是在Go语言中是这样声明的 var 变量名 数据类型。声明方式主要有以下几种:
逐个声明:
func test() {
var name string
var age int
var m bool
}
批量声明:
func test() {
var (
name string
age int
m bool
)
}
//1.
var name = "zhangsan"
var age = 20
var m = true
//2.
var name string
var age int
var m bool
name = "zhangsan"
age = 20
m = true
//3.
name := "zhangsan"
age := 20
m := true
//4.
name, age, m := "zhangsan", 20, true
package main
import "fmt"
func getNameAndAge() (string, int) {
return "zhaosi", 20
}
func main() {
name, age := getNameAndAge()
fmt.Printf("name: %v\n", name)
fmt.Printf("age: %v\n", age)
}
package main
func main() {
//常量定义
const PI float64 = 3.14
const PI2 = 3.15
const (
width = 100
height = 200
)
const i, j = 1, 2
const a, b, c = 1, "zhaosi", true
}
iota是一个可被编译器修改的常量,它的默认值是0,没调用一次加1,遇到const关键字时候被重置为0
func main() {
const (
a1 = iota
a2 = iota
a3 = iota
)
fmt.Printf("a1: %v\n", a1)
fmt.Printf("a2: %v\n", a2)
fmt.Printf("a3: %v\n", a3)
}
func main() {
const (
a1 = iota
_ //表示跳过
a3 = iota
)
fmt.Printf("a1: %v\n", a1)
fmt.Printf("a3: %v\n", a3)
}
func main() {
const (
a1 = iota
a2 = 100
a3 = iota
)
fmt.Printf("a1: %v\n", a1)
fmt.Printf("a2: %v\n", a2)
fmt.Printf("a3: %v\n", a3)
}
package main
import "fmt"
func main() {
//定义
var flag bool
flag = true
flag1 := false
//使用
age := 18
isAdult := age >= 18
fmt.Printf("isAdult: %v\n", isAdult)
if isAdult {
fmt.Printf("你已经成年了")
} else {
fmt.Printf("你还未成年")
}
}
需要注意的是,在c语言中我们可以使用0和1来代替false和true,但是在Go语言中是不行的。
Go语言支持整型和浮点型数字,并且原生支持复数,其中位的运算采用补码。
Go也有基于架构的类型,例如:int、uint(无符号整数)、uintptr(整数类型)
这些类型的长度都是根据运行程序所在操作系统类型决定的:
Go语言中没有float类型(只有float32和float64)没有double类型
func main() {
//十进制
a := 10
fmt.Printf("十进制:%d\n", a) //%d
fmt.Printf("二进制:%b\n", a) //%b
}
// 八进制 以0开头
b := 077
fmt.Printf("%o \n", b)
//十六进制 以0x开头
c := 0xff
fmt.Printf("%x \n", c) //ff
fmt.Printf("%X \n", c) //FF
fmt.Printf("%f \n", math.Pi)
fmt.Printf("%.2f \n", math.Pi) //保留两位小数
内置的len函数可以返回一个字符串中的字节数目(不是rune字符数目),索引操作s[i]返回第i个字节的字节值,i必须满足0 ≤ i< len(s)条件约束。
func main() {
s := "hello, world"
fmt.Println(len(s)) // "12"
fmt.Println(s[0], s[7]) // "104 119" ('h' and 'w')
}
子字符串操作s[i:j]基于原始的s字符串的第i个字节开始到第j个字节(并不包含j本身)生成一个新字符串。生成的新字符串将包含j-i个字节。
fmt.Printf(s[0:5]) //hello
不管i还是j都可能被忽略,当它们被忽略时将采用0作为开始位置,采用len(s)作为结束的位置。
fmt.Println(s[:5]) // "hello"
fmt.Println(s[7:]) // "world"
fmt.Println(s[:]) // "hello, world"
其中+操作符将两个字符串连接构造一个新字符串:
fmt.Println("goodbye" + s[5:]) // "goodbye, world"
当然还可以使用`......`来表示多行字符串
s := `
hello
,
world
!
`
fmt.Printf("s: %v\n", s)