当前位置: 首页 > 编程日记 > 正文

Go语言开发常见陷阱,你遇到过几个?

链客,专为开发者而生,有问必答!

此文章来自区块链技术社区,未经允许拒绝转载。

在这里插入图片描述

Go作为一种简便灵巧的语言,深受开发者的喜爱。但对于初学者来说,要想轻松驾驭它,还得做好细节学习工作。

初学者应该注意的地方:

大括号不能独立成行。

未使用变量错误——对于全局变量和函数参数变量,是可以定义后不使用的。但是对于函数内部变量来说,如果进行定义后不进行使用,编译器会提示错误。

导入包未调用错误——导入包后,如果不进行调用,例如函数,接口,结构及变量等对象,那么会出现编译错误。这里建议使用空白表示符“_”来避免类似错误。

变量简写只适用于函数内部。

重新定义变量要使用简写声明——你不能在一个独立的语句中重新定义一个变量,但在复合变量场合是允许的。重新定义的变量需存在于同一区块,否则会产生一个阴影变量。

意外的变量——变量简写语法由于十分简便,因此很容易会把它作为一个常规的指派操作。虽然可以通过编译,但是其结果却不是我们想要的。

不能使用“nil”来定义一个没有类型的变量——“nil”关键字可用于表示“0值”,例如在接口,函数,指针等对象中。但如果把它用于定义一个没有进行类型声明的变量,将会导致编译错误,因为编译器无法确定变量类型。

使用“nil”切片(Slices)和图(Maps)——为“nil”切片添加对象是可以的,但对于图来说,这样会造成运行缓慢。

图容量——可以在创建时设定图的容量,但是不用对图使用cap()。

字符串不能为“nil”。

数组函数参数——对于C/C++开发者来说,数组如同指针;当把数组传入函数时,函数会引用相同的内存位置,所以能够更新原始数据。但在Go中,数组是值,因此当把数组传入函数时,得到的是原始数组数据的副本。因此如果想更新数组数据,这个造成问题。

切片和数组“范围(range)”里的异常——在使用for-in或foreach语句时会遇到该问题。在Go中,range的定义是有所不同的。它会产生两个值:第 一个为索引项,第二个说项的数据。

单维度的切片和数——要创建一个动态多维度数组,要使用独立切片。首先,要创建外层切片;然后,要对每个内联切片进行分配。每个内联切片对于其它切片来说是独立的。

访问不存在的图键——如果想知道一个给定图记录是否存在,应该通过检查来自图访问操作的第二个值。

不可改变的字符串——如果想通过索引运算符来更新一个字符串变量中的独立字符是会出现错误的,由于字符串是只读的字节片。正确做法是使用一个单字节片进行操作而不是转成字符串类型进行操作。

字符串和字节片转换——当把字符串转换为字节片时,你得到是一份完整的原始数据。Go提供了一对[]byte to string,string to []byte的优化转换操作,以防止造成额外分配。

字符串和索引运算符——字符串中的索引运算符返回的是字节值而不是字符。

字符串不总是UTF8文本——字符串没有被限定为UTF8文本。它们可以包含任何字节。只有当使用字符串常数时才是UTF8文本。

字符串长度——Go中应使用RuneCountInString()函数来取得字符串长度值而不是len()函数。

多行切片,数组,和图定义中缺少逗号。

log.Fatal和log.Panic:日志库提供了不同的日志级别。

预置数据结构运算是不同步的。

在range中的字符串迭代值。

使用for range来进行图迭代。

Switch语句的注意事项:switch语句的case区块默认是隔断的。

递增和递减:Go中是不支持i++或++i的递增/减操作的。

按位不是运算符:很多语言使用~来作为一元逻辑非运算符,而Go中则使用^。

运算符优先级差异。

导出结构域是没有编码。

程序结束时没有销毁Go线程。

当目标接收器就绪时就发送一个缓冲区通道返回。

封闭通道发送的问题。

使用“nil”通道。

有值接收器的方法不能用于改变原始值。

中级开发者应该注意的地方:

关闭HTTP响应。

关闭HTTP连接。

结构,数组,切片和图的比较。

可以使用==运算符来比较不同的结构变量。

从异常中恢复。

可以使用recover()来捕获/拦截异常。

更新和引用切片,数组,及图“range”的项值。

切片的“隐藏”数据。

切片数据的错误。

“变味”的切片。

类型声明和方法。

for switch和for select代码块的终止。

for语句中的迭代变量和结束。

延迟的函数调用参数求值。

延迟函数调用执行。

错误类型的判断。

断开的Go线程和资源泄漏。

高级开发者应该注意的地方:

对值实例使用指针接收方法。

更新图值域。

“nil”接口和“nil”接口值。

堆栈变量。

GOMAXPROCS,并发,并行化。

抢先调度。

以“大括号不能独立成行”为例:

错误写法:

package main

import “fmt”

func main()
{ //error, can’t have the opening brace on a separate line
fmt.Println(“hello there!”)
}
编译错误提示:

/tmp/sandbox826898458/main.go:6: syntax error: unexpected semicolon or newline before {

正确写法:

package main

import “fmt”

func main() {
fmt.Println(“works!”)
}

相关文章:

sxoi爆炸祭

好吧,纯粹是去玩玩的,我这么一个弱省的蒟蒻,进队纯粹是开玩笑。。。。 Day0 去五中试机,感觉电脑手感不错,打了半个线段树的板子才发现试机要在自己的电脑上试,然后我无奈的搬东西(从26号搬到2号…

wiki多个文件一起导入_mac文件信息管理工具EagleFiler for Mac分享给大家

EagleFiler for mac使得管理您的信息方便。它可以让你存档和搜索邮件,网页,PDF文件,字处理文档,图像,等等。使用它可以从不同的来源收集信息。浏览不同类型的文件采用标准的三窗格界面。组织他们到文件夹中&#xff0c…

【bzoj1951】 Sdoi2010—古代猪文

http://www.lydsy.com/JudgeOnline/problem.php?id1951 (题目链接) 题意 废话一堆。。求解:$$g^{\sum_{d|n} C_n^d}~mod~p$$ Solution 真的是数论经典题,什么都用上了。 因为费马小定理,每$p-1$个$g$相乘会得到$1$,那么容易得到&…

区块链之智能合约详解

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 什么是智能合约? 智能合约又称智能合同,是由事件驱动的、具有状态的、获得多方承认的、运行在区块链之上的、且能够根据预设…

子类化内置类型

Python 2.2之后内置类型开始可以子类化了 但是,CPython中的内置类型不会调用用户重写的类的特殊方法。 PyPy的文档中描述了这个问题。subclasses-of-built-in-types 正式情况下,CPython 并没有官方规定内置类型的子类中重写的方法是否会被隐式调用。基本…

网上商城系统源代码_多用户系统商城授权有几种方式?

网上商城系统一般都需要获取正规授权才可以投入商业使用范围,许多系统开发商为了适应不同企业的需求提供了几种不同的授权方式,企业可以选择合适的方式获得系统的使用权。下面HiShop小编就来为大家介绍一下多用户商城系统的授权方式。一、多用户系统商城…

java学习:对synchronized的测试

平时对synchronized这个关键字没有太在意,对它的认识停留在粗略翻了一下百度百科的状态,百度百科对它的解释是: “Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候&#xff…

Selenium(3)

练习1:Ecshop  录制登录后退出业务  打开系统  存储页面的标题     a.点击"登录"按钮     b.输入用户名:testing      存储输入的用户名     c.输入密码:123456     d.点击"立即登录"按钮 …

php 爬虫_Rad爬虫结合W13Scan扫描器挖掘漏洞

一、背景这几天一直在研究W13Scan漏洞扫描器,因为对Python不是太熟悉,所以进度有点慢,一直没看懂怎么将代理请求的数据转发到扫描队列中去,决定先熟悉熟悉这个功能再说;Rad爬虫最近比较火,于是就是就选择它…

Python 爬取网页HTML代码

#/usr/bin/env python #-*- coding:utf-8 -*-import urllib2 import sys import chardetreq urllib2.Request("http://tycool.top/") content urllib2.urlopen(req).read() typeEncode sys.getfilesystemencoding()##系统默认编码 infoencode chardet.detect(con…

区块链兼容以太坊智能合约

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 引言 随着区块链技术以及应用的普及,越来越多的区块链出现在大众视野中。由于区块链技术的开源特性,任何公司和个人都可以…

Linux常用命令--网终设置

1、把自己(sa)添加到sudoers配置文件中,以便于获取权限 vim /etc/sudoers 编辑文件(部分centOS版本没有vim命令,则用vi即可) 找到【root ALL(ALL) ALL】语句,在下面添加: sa ALL…

python示例异常处理与程序调试_笔记:Python异常处理与程序调试

Python异常处理与程序调试Python提供了强大的异常处理机制,通过捕获异常可以提高程序的健壮性。异常处理还具有释放对象,中止循环的运行等作用。在程序运行的过程中,如果发生了错误,可以返回事先约定的一个错误代码。"try...…

js传入参数为字符串问题

示例: var device_mac"11qweq234ert";//第一种方式会报错:Onclick SyntaxError: identifier starts immediately after numeric literal,数字后面紧跟着字符这种写法只有device_mac是数字的时候是正确的。传入的为字符串则应该使用…

区块链热度背后的资本市场

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 进入2018年之后大家对于加密数字货币以及区块链等话题都各自有各自的意见和想法,很多人觉得区块链技术和加密数字货币是泡沫&#xff…

袋鼠过河(动态规划)

题目描述 一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远。每个弹簧力量不同,用一个数字代表它的力量,如…

jenkins-svn配置

转载于:https://www.cnblogs.com/caer/p/5924337.html

python查看所有异常_如何获取python异常发生的实际行号?

如果你想按你描述的那样做from functools import wrapsimport sys, os, tracebackdef catch_exceptions(function):wraps(function)def decorator(*args, **kwargs):try:return function(*args, **kwargs)except Exception as e:exc_type, exc_obj, exc_tb sys.exc_info()prin…

区块链从一夜暴富到一夜暴“负”的辛酸史

3.15打假日,打假虽然年年有,但与往年有别的是,今年区块连技术得到了诸多重视以及初步发展,一些带有诈骗性质的数字资产交易所在用血腥的方式不断收割着更低层级的用户,而这些平台的受害者,却往往得不到任何…

iOS消息转发

消息转发是一种功能强大的技术,可以大大增加Objective-C的表现力。什么是消息转发?简而言之,它允许未知的消息被困住并作出反应。换句话说,无论何时发送未知消息,它​​都会以一个很好的包发送到您的代码中&#xff0c…

python参数类型限定_python限定方法参数类型、返回值类型、变量类型等|python3教程|python入门|python教程...

https://www.xin3721.com/eschool/python.htmltyping模块的作用自python3.5开始,PEP484为python引入了类型注解(type hints)类型检查,防止运行时出现参数和返回值类型、变量类型不符合。作为开发文档附加说明,方便使用者调用时传入和返回参数…

CentOS VMware 配置IP小结 静态 配置 桥接 NAT

系统启动后可先ping下外网或局域网内其它机器。如果配置虚拟机时选择的NAT上网方式,后面需要配置固定IP,请先参见VMware NAT方式下设置静态IP获得可用的IP范围和网关等信息。先将ifcfg-eth0备份到home目录下,不要放在与它同一目录下&#xff…

区块链简史:解读这场技术革命的前世今生

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 真格基金徐小平的一个“内部讲话”被泄露,揭开了创投圈对区块链的新一轮热衷。 在这份微信群的“内部讲话”中,徐小平把区块…

IncDec Sequence(codevs 2098)

题目描述 Description 给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一。  问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。 输入描述 Input…

C++ 中set

set特点: 所有元素不会重复,重复插入已经有的新值无效;所有元素按顺序排列;unordered_set除外键和值相同,所以set中的值是不可更改的set的各成员函数列表如下: 1.begin()--返回指向第一个元素的迭代器 // 如果当前容器…

python自动排课表_【python-leetcode210-拓扑排序】课程表Ⅱ

现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,返回你为了学完所有课…

简单粗暴告诉你什么是区块链

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 区块链是什么?它是如何工作的? 比特币已经成为现代互联网的潮流 - 随之而来的是区块链。人们说区块链技术将导致互联网运作…

【Codeforces】Round #375 (Div. 2)

Position:http://codeforces.com/contest/723 我的情况 啊哈哈,这次raiting肯定要涨,接受过上次的教训,先用小号送肉,大号都是一发切,重回蓝咯 结果。。。 FST!! 不,这次是skip&…

python的matplotlib背景线_python中matplotlib的颜色及线条 控制

https://www.cnblogs.com/darkknightzh/p/6117528.htmlhttps://blog.csdn.net/qq_34337272/article/details/795555441.设置栅格(1)使用pyplot api命令打开栅格:plt.grid(true)设置栅格格式:plt.grid(colorr, linestyle--, linewidth1,alpha0.3)(2)使用axes类面向对…

系统权限设计思路

权限系统通常包括如下基本元素:用户、角色、权限、资源、操作。 角色分类:总经理、部长、员工。(在实际中一个用户可能存在多个角色,这就要考虑到权限累加处理) 权限分类:如”员工考勤权限”、”审核权限”…