时隔一年、终于下定决心认真的学习一下golang,为此昨天纠结了好久要不要买一个正版的goland,最后还是没舍得买…为什么要学习go呢?如今在当前这家公司已经工作两年,悠哉的生活使我日日堕落…体重长胖10斤,这不是最关键的,因为很久没认认真真写过代码了…java不能说忘了,但确实提不起兴趣.想到断断续续的一直使用过go,最终还是下定决心认真学习一下.为此我将更新系列学习blog,从入门语法到项目实战.为大家踩坑.希望大家看到我的学习文章之后少走弯路。以最快的速度上手go!
补充我的开发环境: OS:win11x64 go version: go1.16.6
一、初级入门
1.为什么要学习go?
不知道各位为什么会选择go,从我自己来说.是因为必须有一门新的语言走进我的生活,就像生活要吃饭一样。当然这个有点跑题,go语言作为21世纪新生代编程语言,含着金钥匙出生,谷歌大佬们共同产生的结晶,似乎没有不学习的理由。 并且go开发出了很多优秀的项目,下面给大家一个列表展示一下,以便于让我们知道学习go能做什么。
- docker
- k8s
- ETH开发
- web后端、web服务器
go语言和其他语言一样,其他语言能做的它都可以做。编程这东西,只能说只有你想不到,没有他做不到。
2.go相较其他语言有什么优势和特征?
(1) 特征
说一说go的特征,有人把go比喻成21世纪的C++,我对这句话保持中立意见。因为我是java出身,所以我在对比特征的时候会拿java做比较。
- 强类型,这点和java一样,但是相对java来说的话有更好的机制,在声明的时候可以进行自动推导。
- 编译型语言,和java是一致的,都需要编译后才能运行。但是java是编译成class加载到虚拟机,go的话直接就编译成binary文件可直接运行。从这点上来说go的效率在java之上, 毕竟虚拟机永远不可能比直接执行来得快。
- 跨平台,虽然java也可以跨平台,看似很方便,但实则需要jre的支持。而go只需要在编译的时候选择运行环境相对java来说更加方便。
(2) 优势
- 天生对并发操作的支持,毕竟出生于多核处理器问世之后。
- 及万家之长,站在各位巨人的肩膀上,把新的好的思想学习过来。
3.安装go语言以及注意事项
安装的话相对简单,由于go的版本更迭特别快,所以以前的安装可能并不太适用于现在的版本. 在写这篇文章的时候 go的版本为1.16,我特意从B站找了一个新版go的安装以及环境变量的配置,这里给大家参考一下。
这里是引用 李文周21年5月更新的go环境搭建
GOROOT和GOPATH
GOROOT和GOPATH都是环境变量,其中GOROOT是我们安装go开发包的路径,而从Go 1.8版本开始,Go开发包在安装完成后会为GOPATH设置一个默认目录,并且在Go1.14及之后的版本中启用了Go Module模式之后,不一定非要将代码写到GOPATH目录下,所以也就不需要我们再自己配置GOPATH了,使用默认的即可。
根据以上内容经过我测试后发现下载完安装程序后即使所有都选择默认一直下一步到底也是没有问题的.由于那个博主用的是VSCODE所以我只取了前半部分。 注意:一定要设置goproxy代理,不然从github下载第三方库是没有速度的
可以执行下面的命令修改GOPROXY:
go env -w GOPROXY=https://goproxy.cn,direct
4.安装goland以及破解
完成上一个安装步骤之后就可以搭配一款得心应手的IDE了.这里我选择的是Goland,虽然吃内存,但是64gb任你蹦达…
这个还算比较靠谱,后续我会自己上传一份到网盘,现在先凑乎用吧。 goland破解版下载
5.hello goland
很多教程里会让你创建文件夹并且创建三个子目录
src 代码源文件 bin 编译后的二进制文件pkg 依赖的第三方库的保存目录
之前我也是这样创建的,但现在我只能说:おれは人间をやめるぞ!ジョジョ―――ッ!! 直接创建新项目sdk就是你的go目录,效果大概是这样的… 新建一个空的go文件,输入以下代码
package main
import "fmt"
func main(){
fmt.Println("hello golang")
}
这里需要说的是,一个项目至少要有一个package main和一个main函数,这个和java很像。类似于程序的入口 点击左下角的terminal可以直接进行编译或者运行 可选命令: go build hello.go 此命令可以直接构建一个二进制程序 go run hello.go 此命令不会产生程序但是会执行代码 go install 这个命令是配套 GOBIN一起是用的,需要将环境变量gobin设置制定路径,然后在install的时候可以直接安装,但是感觉用处不是很大。 当输入 go run hello.go 可以出现输出语句的时候表示之前的步骤各位已经跟上做对了。
二、正式进入语法学习
1.变量
在go语言中,声明变量的方式略有特殊,普遍的类C语言声明的方式均为 数据类型 变量名 但是在go中 通常有这么几种声明变量的方式
var name string[可省略] name := "hello" 两种从结果上来说可能是一样的,但是不知道为什么设计了两种变量声明的方式,等以后学明白了再回来修改。 下面来举一些实例
package main
import "fmt"
func main(){
var name = "张三"
age := 25
sex := '男'
isMarried := false
fmt.Printf("姓名:%s年龄:%d性别:%c是否婚配:%t",name,age,sex,isMarried)
}
控制台输出:姓名:张三年龄:25性别:男是否婚配:false 关于go语言数据类型汇总:go数据类型汇总 关于printf函数针对不同类型的格式化可参考此贴:go格式化输出 补充:const 声明常量 只需要写赋值等号
2.指针
说道指针不得不提起C,还记的初学指针的时候那种似懂非懂的感觉吗.还有忘记释放指针导致程序的崩溃吗…还挺值得回忆的,后来学了java,有了引用的概念,发现两者还是比较相似的。而go也借鉴了java的gc机制。从而做到指针回收,虽然指针和引用很像,但是大家还是不要搞混了哦,指针是指针、引用是引用。
- &为取变量的指针
- *为取指针指向的变量
package main
import "fmt"
func main(){
var name = "张三"
var ptr = &name
fmt.Printf("%p\n",ptr)
fmt.Printf("%s",*ptr)
}
控制台输出: 0xc000088230 张三
判断为空值:
package main
import "fmt"
func main(){
res := new(string)
if res == nil{
fmt.Println("is null")
}
}
在go语言中不支持三元运算、地址自加自减、–i ++i
3.字符串
(1) 定义长字符串
package main
import "fmt"
func main(){
message := `Windows PowerShell
版权所有(C) Mincrosoft Corporation。保留所有权利。
`
fmt.Println(message)
}
(2) len函数查看字符长度
package main
import "fmt"
func main(){
message := "姓名termite.fun"
fmt.Println(len(message))
}
控制台:17
(3) 截取字符
package main
import "fmt"
func main(){
message := "姓名termite.fun"
fmt.Println(message[0])
fmt.Printf("%c\n",message[6])
fmt.Printf("%c\n",message[0])
fmt.Printf("%c+%c+%c\n",message[0],message[1],message[2])
fmt.Println(message[0:3])
}
4.数组
(1) 定长数组
三种定义方式,感觉还是最后一种比较方便
package main
import "fmt"
func main(){
var x = [10]int{1,2,3}
var z [10]int = [10]int{12,3,4,5}
y := [10]int{2}
fmt.Println(x)
fmt.Println(z)
fmt.Println(y)
}
(2) 不定长数组(切片、slice)
这个和java的List有点像,使用链表结构
package main
import "fmt"
func main(){
city := []string{"北京","上海","广州","深圳"}
for _, tmp := range city {
fmt.Printf("%s\t",tmp)
}
city = append(city,"海南")
fmt.Println("\n----------------------")
for _, tmp := range city {
fmt.Printf("%s\t",tmp)
}
fmt.Println("\n",city)
fmt.Println(len(city))
fmt.Println(cap(city))
}
在追加到时候会额外扩展容量、和java很像,印象中有个计算公式来着
(3) 遍历
① for
② forrange
package main
import "fmt"
func main(){
y := [4]int{2}
fmt.Println(y[0:4])
for i:=0;i<len(y);i++{
fmt.Println(y[i])
}
for key, val := range y {
fmt.Print(key)
fmt.Print("\t")
fmt.Print(val)
fmt.Print("\n")
}
for _, val := range y {
fmt.Print(val)
fmt.Print("\n")
}
for _, _ = range y {
}
}
|