termite:从零开始的go语言学习生活
时隔一年、终于下定决心认真的学习一下golang,为此昨天纠结了好久要不要买一个正版的goland,最后还是没舍得买…为什么要学习go呢?如今在当前这家公司已经工作两年,悠哉的生活使我日日堕落…体重长胖10斤,这不是最关键的,因为很久没认认真真写过代码了…java不能说忘了,但确实提不起兴趣.想到断断续续的一直使用过go,最终还是下定决心认真学习一下.为此我将更新系列学习blog,从入门语法到项目实战.为大家踩坑.希望大家看到我的学习文章之后少走弯路。以最快的速度上手go!
补充我的开发环境:
OS:win11x64
go version: go1.16.6
Termite:从零开始的go语言学习生活
- 一、初级入门
- 1.为什么要学习go?
- 2.go相较其他语言有什么优势和特征?
- (1) 特征
- (2) 优势
- 3.安装go语言以及注意事项
- 5.hello goland
- 二、正式进入语法学习
- 1.变量
- 2.指针
- 3.字符串
- (1) 定义长字符串
- (2) len函数查看字符长度
- (3) 截取字符
- 4.数组
- (1) 定长数组
- (2) 切片
- (3) 遍历
- ① for
- ② forrange
- 5.map
一、初级入门
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
下载完安装程序后即使所有都选择默认一直下一步到底也是没有问题的.由于那个博主用的是VSCODE所以我只取了前半部分。
注意:一定要设置goproxy代理,不然从github下载第三方库是没有速度的
可以执行下面的命令修改GOPROXY:
go env -w GOPROXY=https://goproxy.cn,direct
5.hello goland
很多教程里会让你创建文件夹并且创建三个子目录
src
代码源文件bin
编译后的二进制文件pkg
依赖的第三方库的保存目录
之前我也是这样创建的,但现在我只能说:おれは人间をやめるぞ!ジョジョ―――ッ!!
直接创建新项目sdk就是你的go目录,效果大概是这样的…
新建一个空的go文件,输入以下代码
package mainimport "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 mainimport "fmt"func main(){var name = "张三"age := 25sex := '男'isMarried := falsefmt.Printf("姓名:%s年龄:%d性别:%c是否婚配:%t",name,age,sex,isMarried)
}
控制台输出:姓名:张三年龄:25性别:男是否婚配:false
补充:const 声明常量 只需要写赋值等号
2.指针
说道指针不得不提起C,还记的初学指针的时候那种似懂非懂的感觉吗.还有忘记释放指针导致程序的崩溃吗…还挺值得回忆的,后来学了java,有了引用的概念,发现两者还是比较相似的。而go也借鉴了java的gc机制。从而做到指针回收,虽然指针和引用很像,但是大家还是不要搞混了哦,指针是指针、引用是引用。
- &为取变量的指针
- *为取指针指向的变量
package mainimport "fmt"func main(){var name = "张三"var ptr = &namefmt.Printf("%p\n",ptr)fmt.Printf("%s",*ptr)
}
控制台输出:
0xc000088230
张三
判断为空值:
package mainimport "fmt"func main(){res := new(string)if res == nil{fmt.Println("is null")}
}
在go语言中不支持三元运算、地址自加自减、–i ++i
3.字符串
(1) 定义长字符串
package mainimport "fmt"func main(){//第二行得贴着开头,不然会有tabmessage := `Windows PowerShell
版权所有(C) Mincrosoft Corporation。保留所有权利。
`fmt.Println(message)
}
(2) len函数查看字符长度
package mainimport "fmt"func main(){//在go中文占三个长度message := "姓名termite.fun"fmt.Println(len(message))
}
控制台:17
(3) 截取字符
package mainimport "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 mainimport "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) 切片
这个和java的List有点像,使用链表结构
package mainimport "fmt"func main(){// 切片不光有length,还有sizecity := []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很像,印象中有个计算公式来着
package mainimport "fmt"func main(){// 切片不光有length,还有sizecity := []string{"北京","上海","广州","深圳"}// 从第二个截取 取一个city1 := city[1:2]fmt.Print(city1)// 对切片赋值会改变本身、相当于一个引用city1[0] = "hello"fmt.Print(city)//从最开始截取取三个 city1 = city[:3]fmt.Print(city1)}
切字符串也是一样的、但是不支持中文
指定切片的容量
package mainimport "fmt"func main(){city := []string{"北京","上海","广州","深圳"}// 创建切片时指定长度和容量 容量可以省略city2 := make([]string,2,4)city2 = city[:2]fmt.Println(city2)fmt.Print(len(city2),cap(city2))}
深拷贝
package mainimport "fmt"func main(){city := []string{"北京","上海","广州","深圳"}// 深克隆 复制内容后修改值不会改变、将变成一个全新的数组city3 := make([]string,len(city))// 拷贝、这里我认为在go中声明长度的为数组、无长度为切片copy(city3,city)city3[0] = "china"fmt.Println(city3)fmt.Println(city)
}
(3) 遍历
① for
② forrange
package mainimport "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 {}
}
5.map
map思想和java是一直的、但是语法稍微有一些区别。
变量 := map[key]value{}
package mainimport "fmt"func main(){// 直接赋值json := map[int]string{1:"look",2:"i am a go-learner"}fmt.Print(json)// 先声明后赋值json1 := map[int]string{}json1[1] = "hibernate"fmt.Println(json1)// 遍历for tmp := range json{fmt.Println(json[tmp])}// 根据索引判断元素是否存在_,ok := json[3]fmt.Print(ok)// 删除delete(json,1)
}
更新于 2021年7月17日
termite:从零开始的go语言学习生活相关推荐
- C语言学习——从零开始学编程(第四篇:函数)
目录 前言--小颖的话 一.函数的概念 二.C语言中函数的分类 1.库函数 1.自定义函数 1)函数名 2)函数返回值 3)函数参数 4)实现几个简单函数 三.函数的形参与实参 1.实际参数 2.形式 ...
- C语言学习——从零开始学编程(第二篇:C语言知识总括)
本节将介绍:C语言的基本框架和大部分知识的浅了解(记得先看目录哦~~) 前言--小颖的话 提示:本文篇幅长,知识点多,可以分开学习,记得收藏点赞哦~ 一.数据类型 1.C语言中的关键字 2.不同类型所 ...
- c语言学习自我评价,学习自我评价4篇
学习自我评价4篇 发布时间:2019-04-08 在这次研究性学习中,我们小组在老师的指导下,通过全体成员的协作分工.研究探讨,集全体之智慧,个人之所学,充分将课本中的理论知识与生活实践相结合,用理论 ...
- 她回顾过去的学习生活,印象最深刻的并非是收获荣耀的高光时刻, 而是在“看文献、做科研、写论文”循环中推进的每一步...
一不留神又到期末了,热搜上都在数着哪个学校的寒假更长,而我只想问,科研人的论文都写完了吗? 反正我是恨不得克隆十个自己,一个泡在实验室盯实验结果,一个去盯基金申请,一个去写月底要送审的稿子..... ...
- 华尔街英语学习软件_华尔街英语吧啦吧啦聊点啥:语言学习交流至上
撇开学前阶段不说,现在从小学到初中.高中,再到大学,甚至到职场,英语学习似乎从未缺席,就连华尔街英语委托知名网上市场研究公司YouGov制作的<全球英语研究报告>中也显示,全球潜在英语学习 ...
- 【特别版】计算机哲学对学习生活借鉴的几个例子
文本纯属玄学,不喜勿喷 2020.03.11 1.数据库和心理表征 在生活中,定义以下操作 1.设计字段,也就是模板.对应要记录的内容 2.创建文章,按照模板填空. e.g. #### problem ...
- C语言学习笔记-P1 初识C语言(2)
C语言学习笔记-P1 初识C语言(2) C语言学习笔记-P1 初识C语言(2) 一.常量 1.字面常量 2.const修饰的常变量 3.#define定义的标识符常量 3.枚举常量 二.字符串+转义字 ...
- C语言学习笔记-P1 初识C语言(1)
C语言学习笔记-P1 初识C语言(1) P1 初识C语言(1) 一.什么是C语言 1.定义 2.发展 二.第一个C语言程序 Hello World 三.数据类型 四.变量,常量 未完待续!!! P1 ...
- 寒假回归篇——C语言学习感悟2022.1.16
前言 Everybody!欢迎来到一飞的博客!没错,历经将近三个礼拜的间隔,我又回来啦!前端时间由于在学校里学习和生活上的各种事情,停更了不短的时间,现在,我回来啦! 不在的时间里,我也关注着我的CS ...
最新文章
- 深度学习背后的基础-神经网络揭秘
- 以下可以采用python语言保留字的是-以下选项中不是 Python 语言的保留字的是
- db和model用哪个开发大型项目 thinkphp_Java程序员开发大型应用程序时,必须要掌握几个的技巧...
- 系统运维|IIS的日志设置
- String类的使用 Part2
- 如何通过属性给实体赋值
- 因HTTP的Header长度过长导致下载文件名出现乱码的问题
- Python Day42
- 自定义 Behavior - 仿新浪微博发现页的实现
- 使用js进行智慧树刷课
- android 简历 android 3年 上海.doc
- 服务器宕机指的是什么意思?
- c# workflow集成_将Google Wave与Windows Workflow集成
- 电脑桌面计算机文件打不开怎么办,电脑开机桌面文件都点不开的解决方法
- robot_marm catkin_make报错
- 合成孔径雷达干涉测量InSAR数据处理、地形三维重建、形变信监息提取、测
- Jedis使用lua脚本完成令牌桶限流
- python输入日期选择日期_python输入日期输出星座?
- 使用STM8S105K4T6C 模数转换器的12通道
- B. Equalize by Divide - 思维+构造+排序
热门文章
- java云闪付,第三方支付-银联云闪付开发教程
- 【论文精读】2016-CVPR-Learning temporal regularity in video sequences
- Spyder 中 Reloaded modules 错误的解决方法
- 【网络问题】微软商店无法打开:重试该操作,无法加载页面。请稍后重试
- Python爬虫,30秒爬取500+篇微信文章!太强啦!
- 普通家用电风扇电机绕组
- 使用VsCode管理Gitee仓库中的项目
- Android studio 利用MPAndroidChart制作饼图
- AWS免费套餐服务器部署NET CORE网站
- Smmu硬件寄存器—V2