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' 这可 ...
随机推荐
- 本周四晚19:00知识赋能第八期第1课丨ArkUI框架整体设计
OpenAtom OpenHarmony(以下简称"OpenHarmony")开源开发者成长计划项目自 2021 年 10 月 24 日上线以来已经走过了7期,为开发者提供了一个良 ...
- 在Centos 8 服务器用tmux多开窗口
在 CentOS 服务器上使用 tmux 来多开窗口是一个高效的方式.tmux 是一个终端复用器,它允许你在一个终端窗口中打开多个终端会话,还可以在会话之间轻松切换,非常适合长时间运行程序或多任务操作 ...
- SQL ALTER TABLE 语句- 灵活修改表结构和数据类型
SQL ALTER TABLE 语句 SQL ALTER TABLE 语句用于在现有表中添加.删除或修改列,也可用于添加和删除各种约束. ALTER TABLE - 添加列 要在表中添加列,请使用以下 ...
- 聊聊ChatGLM3多用户并发API调用的问题
转载请备注出处:https://www.cnblogs.com/zhiyong-ITNote 背景 目前在公司内部4张A10的GPU服务器上部署了ChatGLM3开源模型:然后部署了官方默认的web_ ...
- K8S 性能优化 - K8S APIServer 调优
前言 K8S 性能优化系列文章,本文为第二篇:Kubernetes API Server 性能优化参数最佳实践. 系列文章: <K8S 性能优化 - OS sysctl 调优> 参数一览 ...
- docker 应用篇————docker 网络[十七]
前言 简单介绍一下docker 网络. 正文 使用ip addr. 可以看到网络. 有一个虚拟网卡: 那么基本上容器就处于这样的模式了. 那么也就是所有容器都在同一网关下面了. 那么问题来了,理论上容 ...
- 第12課-Mirth生产环境宕机后基于服务配置XML备份恢复之记录
Mirth Connect作为集成交换平台,生产环境互联互通了众多系统,脑残的是连自家关键业务系统都依托mirth来进行交互,宕机或故障对身处其中的一次紧张的业务系统升级都造成高度的精神紧张:这种宕机 ...
- 剑指offer004(Java)-只出现一次的数字(中等)
题目: 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 .请你找出并返回那个只出现了一次的元素. 示例1: 输入:nums = [2,2,3,2] 输出:3 示例 ...
- 力扣540(java&python)-有序数组中的单一元素(中等)
题目: 给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次. 请你找出并返回只出现一次的那个数. 你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间 ...
- dotnet 6 HttpClientHandler 和 SocketsHttpHandler 有什么差别
本文来告诉大家在 dotnet 6 的 HttpClientHandler 和 SocketsHttpHandler 两个类型有什么不同 在创建 HttpClient 时,可以在 HttpClient ...