IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> termite:从零开始的go语言学习生活 -> 正文阅读

[Java知识库]termite:从零开始的go语言学习生活

时隔一年、终于下定决心认真的学习一下golang,为此昨天纠结了好久要不要买一个正版的goland,最后还是没舍得买…为什么要学习go呢?如今在当前这家公司已经工作两年,悠哉的生活使我日日堕落…体重长胖10斤,这不是最关键的,因为很久没认认真真写过代码了…java不能说忘了,但确实提不起兴趣.想到断断续续的一直使用过go,最终还是下定决心认真学习一下.为此我将更新系列学习blog,从入门语法到项目实战.为大家踩坑.希望大家看到我的学习文章之后少走弯路。以最快的速度上手go!

补充我的开发环境:
OS:win11x64
go version: go1.16.6

一、初级入门

1.为什么要学习go?

不知道各位为什么会选择go,从我自己来说.是因为必须有一门新的语言走进我的生活,就像生活要吃饭一样。当然这个有点跑题,go语言作为21世纪新生代编程语言,含着金钥匙出生,谷歌大佬们共同产生的结晶,似乎没有不学习的理由。
并且go开发出了很多优秀的项目,下面给大家一个列表展示一下,以便于让我们知道学习go能做什么。

  1. docker
  2. k8s
  3. ETH开发
  4. web后端、web服务器

go语言和其他语言一样,其他语言能做的它都可以做。编程这东西,只能说只有你想不到,没有他做不到。

2.go相较其他语言有什么优势和特征?

(1) 特征

说一说go的特征,有人把go比喻成21世纪的C++,我对这句话保持中立意见。因为我是java出身,所以我在对比特征的时候会拿java做比较。

  1. 强类型,这点和java一样,但是相对java来说的话有更好的机制,在声明的时候可以进行自动推导。
  2. 编译型语言,和java是一致的,都需要编译后才能运行。但是java是编译成class加载到虚拟机,go的话直接就编译成binary文件可直接运行。从这点上来说go的效率在java之上, 毕竟虚拟机永远不可能比直接执行来得快。
  3. 跨平台,虽然java也可以跨平台,看似很方便,但实则需要jre的支持。而go只需要在编译的时候选择运行环境相对java来说更加方便。

(2) 优势

  1. 天生对并发操作的支持,毕竟出生于多核处理器问世之后。
  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

很多教程里会让你创建文件夹并且创建三个子目录

  1. src 代码源文件
  2. bin 编译后的二进制文件
  3. 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中 通常有这么几种声明变量的方式

  1. var name string[可省略]
  2. 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机制。从而做到指针回收,虽然指针和引用很像,但是大家还是不要搞混了哦,指针是指针、引用是引用。

  1. &为取变量的指针
  2. *为取指针指向的变量
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(){
	//第二行得贴着开头,不然会有tab
	message := `Windows PowerShell
版权所有(C) Mincrosoft Corporation。保留所有权利。
`
	fmt.Println(message)
}

(2) len函数查看字符长度

package main

import "fmt"

func main(){
	//在go中文占三个长度
	message := "姓名termite.fun"
	fmt.Println(len(message))
}

控制台:17

(3) 截取字符

package main

import "fmt"

func main(){
	//在go中文占三个长度
	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(){
	// 切片不光有length,还有size
	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")
	}
	//都忽略的情况 使用 = 这里会不会和java一样不使用:相当于没有开辟新的存储空间?
	for _, _ = range y {
	
	}
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:08:15  更:2021-07-16 11:08:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 8:25:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码