
个人简介:
> 📦个人主页:赵四司机
> 🏆学习方向:JAVA后端开发
> 📣种一棵树最好的时间是十年前,其次是现在!
> ⏰往期文章:SpringBoot项目整合微信支付
> 🧡喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。
前言:
最近发现Golang很火,而且他还是一款编译型语言,速度快,处理高并发能力强。抱着一颗好奇的心,我打算学一下Golang的一些基础知识拓宽一下自己的知识面,领会一下Go语言的神奇之处,假如后面需要用到Go语言也能更容易上手。俗话说好记性不如烂笔头,而且我本来就记性不怎么好,所以我学习喜欢做上笔记记录,这里我就将我的学习成果记录到Golang专栏里,自己以后复习也好翻阅,要是你也有兴趣学习Golang也可以查看我这个专栏的文章。
目录
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)