面试题之编程语言规范

一、问题

趋势科技golang/python暑期软开实习一面

面试官:你听说过PEP8规范吧,至少列举5条规范
面试官:谈谈golang编码规范

二、PEP8规范

​PEP是Python Enhancement Proposal的缩写,通常翻译为”Python增强提案”。​每个PEP都是一份为Python社区提供的指导Python往更好的方向发展的技术文档,其中的第8号增强提案(PEP 8)是针对Python语言编订的代码风格指南。
语言规范不会影响代码的实际功能,但是好的编程规范,写出可读性强的代码可以保证开发效率和团队协作效率的提升。

  • 每行缩进最好用4个空格代替tab,不允许tab和空格混用,因为有的编辑器默认的是tab键是两个空格,所以如果tab和空格混用会造成代码格式混乱。
  • 单行最大字符限制79,用\换行。
  • 避免通配符导入,分行导入不同的包,通配符导入有时候无法导入一些特定的变量或者方法,并且多个包都是用通配符导入会有命名冲突的问题。
  • 不要害怕用过长的命名变量,越清楚越好,比如使用is,has等前缀标识bool型变量。
  • 命名用英文,而不是拼音,来提高可读性。
  • 下划线分割英文,提高可读性,python更偏向于使用小写英文与下划线组合的方式标识变量名。
  • 大写字母表示常量
  • 类首字母大写,函数全小写
  • class 的 method 之间一个空行
  • 函数内逻辑无关的段落之间空一行,不要过度使用空行
  • except 要接具体的Exception,使用 finally 子句来处理一些收尾操作
  • 用is代替 == ,is比较的是内存地址,而 == 则需要深入对象字典逐个属性比较,更慢。

默认的PyCharm中有PEP8代码提示,你敲得代码中不符合规范时,会有下划波浪线提示,想要调整提示级别可以直接在右下角调整 Highlighting Level。

二、golang中的代码规范

golang属于静态类型语言,跟python动态类型对比来说,规范更严格一些。

  • 当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用。
  • 命名如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的。

尽量保持包名和目录名一致,采取简短有意义的小写单词作为包名,避免和标准库冲突重复,不要使用混合大小写和下划线

package cnblog

也就是包下面的.go文件,采用小写单词+下换线组合的方式

/cnblog
———— user_model.go

大驼峰命名法命名结构体,结构体内部使用多个初始化格式

// 多行申明
type User struct{
    Username  string
    Email     string
}

// 多行初始化
u := User{
    Username: "golang",
    Email:    "golang@163.com",
}

命名规则基本和上面的结构体类似,单个函数的结构名以 “er” 作为后缀,例如 Reader , Writer,表示单一职责,只有读或者只有写这种行为。

type Reader interface {
        Read(p []byte) (n int, err error)
}
  • 采用大驼峰命名,如果变量包内私有,则首单词小写,比如apiClient。
  • 如果变量为bool类型,也可以以Has,Is等单词开头命名

全部以大写单词组成常量名,但是 采用下划线分隔单词

Go提供C风格的/ /块注释和C ++风格的//行注释。行注释是常态;块注释主要显示为包注释,表达式内禁用块注释

  • 单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释
  • 多行注释也叫块注释,均已以 / 开头,并以 / 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段

每个包都应该有一个包注释,一个位于package子句之前的块注释或行注释。包如果有多个go文件,只需要出现在一个go文件中(一般是和包同名的文件)即可。 包注释应该包含下面基本信息(请严格按照这个顺序,简介,创建人,创建时间):

  • 包的基本简介(包名,简介)
  • 创建者,格式: 创建人: rtx 名
  • 创建时间,格式:创建时间: yyyyMMdd

通常放在接口或者结构体的前一行,对其进行简要介绍,格式为: 结构体名, 结构体说明。同时结构体内的每个成员变量都要有说明,该说明放在成员变量的后面(注意对齐)

包括三个部分

  • 简要说明,格式说明:以函数名开头,”,”分隔说明部分
  • 参数列表:每行一个参数,参数名开头,”,”分隔说明部分
  • 返回值: 每行一个返回值

  • 对局部复杂或者关键位置逻辑采用行内注释

  • 注释内中英文混用时候,采用空格分隔,
  • 单行注释不要过长,不超过120个字符

  • 避免引入无用的包,与python不同的是,如果导入的包未被使用,golang会编译不通过,而在Pycharm中,如果导入的py包未被使用,仅仅是代码块变暗。

  • 不同类型的包顺序,通常import多行的时候,会自动格式化,如果导入包含多种类型的包,建议有顺序的组织包的顺序。不同类型的包之间采用空行,如果是当前项目的其他包,最好采用相对路径。
import (
   "标准库"

   "项目包"

   "第三方包"
)
  • 合并包,用 .点号可以将引入的一个包合并到当前程序下
    这里每次使用Println需要通过fmt包调用
import (
    "fmt"
)
func main(){
    fmt.Println("fmt.Println")
}

通过将fmt合并到当前程序下,可以直接使用Println

  import (
      . "fmt" // 使用 . 合并
  )
  func main(){
      fmt.Println("fmt.Println")
  }
  • 包重命名,包内命名冲突问题,比如有两个包 package1,package2, package2 下有一个对整型做加运算的Add方法,package2 下有一个对float32做加运算的Add方法,两个方法相同,如果都在当前程序下导入两个包,就会出错,如下
import (
  "package1"
  "package2"
)

可以采用重命名的方式对包引入当前程序空间内的时候修改包名。在python中,比如 import package as my_package

import (
  "fmt"
  int_add "package1"
  float_add "package2"
)
func main(){
  fmt.Println(init_add.Add(1, 2))
  fmt.Println(float_add.Add(1, 2))
}
  • 匿名包,引入无用的包的时候会报错,使用 _ 一个下划线可以标识引入的包为匿名引用,虽然不会出现语法错误,但是可能出现一些额外的意想不到的问题。主要原因在于,只要 import 导入一个包,就会自动执行这个包的 init 函数,并且如果一个 package 包下有多个 .go文件,多个 .go文件中都有 init 函数,那么匿名方式导入这个包,不能保证init函数的执行顺序,所以一般不建议一个包包含多个init函数,也不建议使用匿名引用的方法导入包。
import (
  "fmt"
  _ "package1"
)

golang三个痛点可能就是包管理,异常处理以及泛型,go没有异常类型,只有错误。所以也就是有了这种常见的写法

str := "123"
num, err := strconv.Atoi(str)
if err != nil{
  fmt.Println("strconv.Atoi err: ", err)  // 或者打印日志
  return
}
  • 错误处理的原则就是不能丢弃任何有返回err的调用,不要使用 _ 丢弃,必须全部处理。接收到错误,要么返回err,或者使用log记录下来
  • 尽早return:一旦有错误发生,马上返回
  • 尽量不要使用panic,如果使用panic,要用recover捕获
  • 错误描述如果是英文必须为小写,不需要标点结尾
  • 采用独立的错误流进行处理

Original: https://www.cnblogs.com/welan/p/16347626.html
Author: weilanhanf
Title: 面试题之编程语言规范

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622299/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 单元测试框架Pytest

    pytest是第三方库,使用前要先进行安装 pip install pytest pytest单元测试框架的核心功能: 收集用例:进入目录,运行pytest 指定用例函数的定义规则…

    Python 2023年9月11日
    036
  • 【Python】绘制空气质量日历图

    Original: https://www.cnblogs.com/123456feng/p/16112309.htmlAuthor: 蚂蚁ailingTitle: 【Python…

    Python 2023年5月24日
    084
  • 基于 centOS7 的 redis 安装

    基于 centOS7 的 redis 安装 基于SpringBoot+VUE的后台管理系统免费开源,欢迎观赏。在线地址:http://liawan.javapub.net.cn/。…

    Python 2023年6月10日
    070
  • Python 测试框架pytest

    1、简介 pytest 是一个成熟的、功能齐全的 Python 测试工具,帮助你编写更好的程序。 2、特点 1)容易上手,入门简单,文档丰富,文档中有很多demo学习 2)可以支持…

    Python 2023年9月9日
    042
  • 在浏览器中Django项目的静态文件打不开的一个原因

    2022-09-27 问题描述: 编写Django代码时,设置了一个”static”文件夹,在里面放置了一张图片。在”setting&#8221…

    Python 2023年6月9日
    070
  • 读写操作

    put write read getline 文件指针 1.文件读写是否成功 good() bad() fail() f.open后直接使用f作为条件来判断; 2.是否读到文件末尾…

    Python 2023年6月12日
    052
  • mac使用allure_pytest+allure在mac下配置和报告输出

    一.其他环境预装 1.java 1.8 二.allure安装(下载包安装) 三.allure环境配置 vim .bash_profile打开配置文件,追加配置 使用i,在文件下追加…

    Python 2023年9月12日
    034
  • python学习日记(基于pandas与seaborn库的绘图及可视化)

    使用pandas与seaborn等库会使我们工作效率大大提高。 在pandas中,我们有多列数据,还有行和列标签。 pandas自身就有内置的方法,用于简化从DataFrame和S…

    Python 2023年8月19日
    063
  • 未来社区的人车房隐私数据权属确认方法

    欢迎来到👏阿提说说👏的博客。很高兴您能看到我的文章。 背景介绍 随着物联网技术的发展,物联网被广泛应用于社会生活中,小区安装有车闸、道闸、安防摄像头、门禁等物联网设备,业主在小区的…

    Python 2023年9月27日
    032
  • Python爬虫——利用Scrapy批量下载图片

    Python爬虫——利用Scrapy批量下载图片 * – Scrapy下载图片项目介绍 – 使用Scrapy下载图片 – + 项目创建 + 项目…

    Python 2023年10月2日
    042
  • OpenCV画框函数rectangle的使用

    OPenCV版本:4.4 IDE:VS2019 功能描述 绘制一个简单的、粗的或填充边界的矩形。函数cv::rectangle绘制一个矩形轮廓或一个填充矩形,其两个相对的角是pt1…

    Python 2023年9月16日
    043
  • Dart语言简介

    简单介绍Dart语言 Dart是一种针对客户优化的语言,亦可在任何平台上快速开发的应用陈旭。目标是为多平台开发提供最高效的变成语言,并为应用程序框架搭配了领会的运行时执行平台。 D…

    Python 2023年10月13日
    034
  • 超市营业额数据分析

    文章目录 1:查看单日交易额最小的3天的交易数据,并查看这3天是周几 * 1.1:导入模块 1.2:数据处理 1.3:输出结果 完整代码 2:把所有员工的工号前面增加一位数字,增加…

    Python 2023年8月7日
    058
  • Flask – app.route参数

    目录 app.route可以传递的参数 app.route可以传递的参数 methods = [ ]: 当前url地址,允许访问的请求方式 类型为可迭代对象,允许八种http请求方…

    Python 2023年8月13日
    051
  • Python基础学习之“数组的存储和处理”

    基于NUMPy模块的数组存储和处理一:创建数组 ❝NumPy模块可以构建多维数据的容器,将各种的数据快速的整合在一块,完成多维数据的计算及大型矩阵的存储和处理。❞ 使用 array…

    Python 2023年8月29日
    051
  • 学习笔记——Django项目中的F对象,Q对象,聚合函数,排序

    2022-09-30 F对象: 在shell中是用于两个有关联的属性之间的查询。 使用实例: 查询书籍表中阅读量大于评论量的记录 前提,进入pycharm,进入虚拟环境,进入she…

    Python 2023年10月31日
    039
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球