go新手常踩的坑
作为一个5年的phper,这两年公司和个人都在顺应技术趋势,新项目慢慢从php转向了go语言,从2021年到现在,笔者手上也先后开发了两个go项目。在学习go语言的过程中也学习并总结了一些相关的东西,这篇文章就分享下自己踩过的一些坑吧。
1、函数的写法
问题:
func main()
{
fmt.Println("php是世界上最好的语言")
}
解决:
如上所示,这种函数的定义写法,在go语言中是错误的,就是 "{" 必须得和函数名在同一行。当然,这种错误在编辑器检测语法的时候就会暴露出来了,正确写法应该如下所示:
func main() {
fmt.Println("php是世界上最好的语言")
}
2、map定义和初始化
问题:
func main() {
var m map[string]string
m["php"] = "世界上最好的语言"
m["go"] = "世界上最好的语言"
fmt.Println(m)
}
解决:
如上所示,这种定义了map,然后直接使用的方式是错误的,会抛出一个panic。少了一个重要的步骤,必须使用make()函数去给map分配内存空间,才能使用。这个对于phper来说,刚开始可能会经常忘掉。正确使用方式如下:
func main() {
m := make(map[string]string, 2)
m["php"] = "世界上最好的语言"
m["go"] = "世界上最好的语言"
fmt.Println(m)
}
3、json格式转换
问题:
type Student struct {
id int
name string
score int
}
func main() {
s := Student{1, "小明", 99}
jsonS, _ := json.Marshal(s)
fmt.Println(string(jsonS))
}
解决:
在做web开发过程中,基本上每天都要和json格式数据打交道,所以学会转换成json格式的数据是必备技能啊。但上面的写法是错误的,打印出来的为空值。这是因为Student结构体中的元素都是小写的,对外是不可访问的,所以必须改成大写的,才能对外输出json格式的数据。正确写法如下:
type Student struct {
Id int
Name string
Score int
}
func main() {
s := Student{1, "小明", 99}
jsonS, _ := json.Marshal(s)
fmt.Println(string(jsonS))
}
4、循环中处理业务问题
问题:
func main() {
data := []int{1, 2, 3}
for _, value := range data {
value += 1
}
fmt.Println(data)
}
解决:
如上所示,我们本身是想对data里面的元素做加1操作的,但发现没有成功。那是因为,我们循环所引用的变量是临时变量,去修改的时候并不会改变数组中的原有结构。正确的做法应该是根据切片的索引去修改,其实就类似于php的foreach,改变数组中的值,也是需要根据索引去改的。如下所示:
func main() {
data := []int{1, 2, 3}
for key := range data {
data[key] += 1
}
fmt.Println(data)
}
5、数组和切片的区别
问题:
func change(data [2]int) {
data[0] = 4
}
func main() {
data := [2]int{1, 2}
change(data)
fmt.Println(data)
}
解决:
如上所示,运行的结果是[1 2] ,而不是[4 2] 。原因是main方法中声明的data是数组,而go语言中的参数传递是值传递,所以不会改变原有的数组值。如果需要实现上述效果,可以改用切片,因为切片本身不会存储数据,他的底层数据会指向一个底层数组,因此在修改切片的元素时,会修改底层数组的相应元素,同时共享同一个底层数组的切片也会相应修改。正确做法如下所示:
func change(data []int) {
data[0] = 4
}
func main() {
data := []int{1, 2}
change(data)
fmt.Println(data)
}
6、:= 声明和初始化变量
问题:
func main() {
flag := 1
if true {
flag := 2
flag++
}
fmt.Println(flag)
}
解决:
如上所示,运行结果仍然是1,而不是2或者3。上述代码中,flag := 2,又重新声明了一个变量flag,但它作用的仅仅是if 判断逻辑里面的,并没有作用到整个main函数全局中。如果要正确影响,应将 := 改为 =,如下所示,结果则为3:
func main() {
flag := 1
if true {
flag = 2
flag++
}
fmt.Println(flag)
}
总结:以上,就是本人在实际开发中,结合自己所学,遇到的一些比较常见的坑点了。当然,也是比较基础的一些点。后面,我也会继续深入学习go,总结更多的经验!
go新手常踩的坑的更多相关文章
- c++ new delete 常踩的坑
WeTest 导读 c++ 是公司开发最常用的语言之一, 那New和Delete 这两个函数是所有开发者即爱又恨的函数.由new 和delete引发的bug , coredump , 让多少程序员加了 ...
- Golang 新手可能会踩的 50 个坑【转】
译文:https://github.com/wuYin/blog/blob/master/50-shades-of-golang-traps-gotchas-mistakes.md 原文:50 Sha ...
- Golang 新手可能会踩的 50 个坑
前言 Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷.如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到. 如果花时间学习官方 ...
- AndroidStudio跑起来第一个App时新手遇到的那些坑
场景 当你看了一个Android教程,满心欢喜想要运行第一个HelloWorld时却发现,Android Studio新建的工程老是报错. 会编译不通过.运行按钮灰色.没有虚拟机,一个简简单单的Hel ...
- C#新手常犯的错误
虽然这篇post的标题是新手常犯的错误,实际上很多有经验的程序员也经常犯这些错误,我整理了一下,就当是笔记.1.遍历List的错误,比如如下代码: List<String> strList ...
- 从零开始学 Java - Spring 支持 CORS 请求踩的坑
谁没掉进过几个大坑 记得好久之前,总能时不时在某个地方看到一些标语,往往都是上面一个伟人的头像,然后不管是不是他说的话,下面总是有看起来很政治正确且没卵用的屁话,我活到目前为止,最令我笑的肚子痛得是下 ...
- webuploader插件,我踩得坑
我在目前的公司做的项目要么是原生写法去做项目,要么就是vue+webpack做项目,但是vue这部分只是用了模板template,vue其他的都没用. 有一个项目需要做上传图片的功能,老大扔给我一个插 ...
- 谈谈调用腾讯云【OCR-通用印刷体识别】Api踩的坑
一.写在前面 最近做项目需要用到识别图片中文字的功能,本来用的Tesseract这个写的,不过效果不是很理想. 随后上网搜了一下OCR接口,就准备使用腾讯云.百度的OCR接口试一下效果.不过这个腾讯云 ...
- Asp.Net Core中使用Swagger,你不得不踩的坑
很久不来写blog了,换了新工作后很累,很忙.每天常态化加班到21点,偶尔还会到凌晨,加班很累,但这段时间,也确实学到了不少知识,今天这篇文章和大家分享一下:Asp.Net Core中使用Swagge ...
- python绘图踩的坑
踩的坑 pyecharts安装地图包 pip install echarts-countries-pypkg 报错Unknown or unsupported command 'install' 这可 ...
随机推荐
- 鸿蒙HarmonyOS实战-ArkUI组件(Video)
一.Video 视频组件是用于应用程序中嵌入视频的一种方法.它可以让用户在网站上观看视频并与其进行交互.通常,视频组件将一个视频文件嵌入应用程序中,并提供一组控件,这些控件允许用户播放.暂停.跳过.音 ...
- 如何翻译 Markdown 文件?-2-几种商业及开源解决方案介绍
背景 近期在搭建英文博客-<e-whisper.com>, 需要对现有的所有中文 Markdown 翻译为英文. 需求如下: 将 Markdown 文件从中文 (zh-CN) 翻译为英文 ...
- Mysql之备份工具
一.备份工具 1. mysqldump mysql服务自带的备份工具:mysqldump备份方式是采用的逻辑备份,其最大的缺陷是备份和恢复速度较慢,如果数据库大于50G,mysqldump备份就不太适 ...
- k8s之helm部署mysql集群
一.简介 Helm Helm 是 Kubernetes 的包管理器. Chart Helm使用的包格式称为 chart.chart存储在Chart Repository. chart就是一个描述Kub ...
- 树模型-CART树
分类回归树CART CART树是后面所有模型的基础,也是核心树 在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择.在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特 ...
- 重新整理数据结构与算法(c#)—— 算法套路二分法[二十四]
前言 前面写过二分法使用的是递归手法,然后该节才有不递归的方式执行. 二分法的时间复杂度为log(2)n.空间复杂度为:1. 正文 代码: static void Main(string[] args ...
- CF1995E Long Inversions(贪心 + 差分)
见代码 点击查看代码 //背景:夸一下自己,CF1955A~E均是自己想出来的,这道题思路是自己想的,唯一没想到用差分数组维护 //原理:贪心(想最左边的1开始,不可能对其左边包括自己操作了,否则又要 ...
- DDD as Code:如何用代码诠释领域驱动设计?
简介: 相较于常规的MVC架构,DDD更抽象.更难以理解,各个开发者对DDD的解释也不尽相同.那么哪种设计方式才更好?在学习时如何知道哪种DDD更正统,没有被别人带歪?本文尝试使用"DDD ...
- 在 Dubbo3.0 上服务治理的实践
简介: Dubbo 3.0 是在云原生背景下诞生的,使用 Dubbo 构建的微服务遵循云原生思想,能更好的复用底层云原生基础设施.贴合云原生微服务架构. Dubbo3.0 介绍 作者 | 十眠 自从 ...
- [Trading] 人物: 陈向忠日内交易技术核心 - 趋势形态与成交量
分时图判断趋势(开仓方向) 只要是低点不断抬高的,就是上涨趋势,高点是否提高是其次的. 只要是高点不断降低的那就是下降趋势,假如低点也在不断降低,那么这样的下降趋势就更加完美一些. 很多人就是看对了趋 ...