对Golang的一些看法

话说当今世界各种语言和伪语言群雄并起,连Rob Pike, Ken Thompson和Robert Griesemer等几位大神也坐不住了,推出了云时代的Go语言,期望其能延续C语言在系统层开发的辉煌。

Go语言的语法设计要求简单,从事过OO开发的人来看GO语言的语法,甚至简单到变态,比如Function称为Func, if不需要括号, 没有Class,以func和struct来组合实现,类似C#中的扩展方法。总体来说,延续了C的风格,并且吸收了一些现代语言的特点。

Go语言有一套自动依赖管理机制,可以很方便的引入第三方包。缺点是:不能区分版本,一旦更新则相同GoPath下所有的项目都要使用最新版本。同时由于Go是强类型编译语言,要更新依赖就要重新整个项目重新编译发布,没有更新某个模块之说。如果你是要开发类似Framework这样的包,你发布了更新,则所有依赖于你的项目都要重新编译部署,这一点比较麻烦。

Go语言支持函数多返回值,并且约定最后一个值为Error,理由是在离异常最近的地方最容易处理异常,不提倡像C#或者Java那样将异常层层传递出去。如果非要那样做,可以用panic, 但Go认为只有发生致命异常才可以这样做。

Go语言中所有引入的包和定义的变量都必须要使用,未使用是不能编译的,从优化上说是有道理的,只是在debug的时候会麻烦一点。并且对代码风格也有严格的约定,对有个性化需求的同学可能不太能接受。

以上吐槽以Go本身的设计哲学来看可能都不是问题,但是对于刚接触的同学看着有些难受,所以做Go项目的时候要转变思维,以Go的方式处理Go的问题。

时间: 2024-11-01 21:13:46

对Golang的一些看法的相关文章

[Golang]你处于使用Go语言的哪个层次,来测测吧

?? Francesc (@francesc) 是 Go 核心团队的一员, 是提倡 Google Cloud 平台的开发者. 他是一个编程语言的爱好者, Google的技术指导大师, Go tour的创造者之一. 这个讨论的灵感来自于另一个 Raquel Vélez 在 JSConf. Slides 的讨论,这个讨论已经发到了这里. Sourcegraph 是下一代编程协作工具, 用于搜索, 探索, 和审查代码. 我们参加GopherCon India 来分享我们是怎样使用 Go 并学习别人是怎

谈谈RPC——golang中jsonrpc和grpc的使用

前言 不知从什么时候rpc这个东西开始进入我们的视野,一开始做开发的时候经常使用的都是http,偶尔使用的是socket进行通信,使用的是restful的方式.但是,一次偶然的机会你会发现RPC这个东西进入了你的视野,而且由于微服务的兴起然他迅速被人们所知,那么它是什么,又如何使用呢? RPC定义 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. 说的再实际一点: 如果我们之前使用UserService.ge

关注你所关注的 - Golang社区调研报告

Golang语言可以说现在炙手可热,大家熟悉的Kubernates 就是使用Golang开发的.我们在最近于伦敦和圣地亚哥举行的GopherCon大会上调查了1000多名开发者,以更好地了解Go 开发社区和对Go Module的总体看法.随着最近发布的Go 1.13版本,现在是向社区分享一些有趣数据的好时机. BTW, 在JFrog,我们也是Go开发者(JFrog CLI和Xray都是用Go编写的). 同时也是GoLang社区的贡献者, 并为社区维护贡献了公共注册中心 Gocenter(gopr

golang []byte转string

golang中,字符切片[]byte转换成string最简单的方式是 package main import ( "fmt" _ "unsafe" ) func main() { bytes := []byte("I am byte array !") str := string(bytes) bytes[0] = 'i'//注意这一行,bytes在这里修改了数据,但是str打印出来的依然没变化, fmt.Println(str) } 打印信息:

golang实现Ringbuf

Ring buffer算法优点:高内存使用率,在缓冲buffer内存模型中,不太容易发生内存越界.悬空指针等 bug ,出了问题也容易在内存级别分析调试.做出来的系统容易保持健壮. package main import ( "bytes" "fmt" ) type Ringbuf struct { buf         []byte start, size int } func New(size int) *Ringbuf { return &Ringb

Golang Hash MD4

//Go标准包中只有MD5的实现 //还好,github上有MD4实现. package main import (     "golang.org/x/crypto/md4"     "encoding/hex"     "fmt" ) func get_md4(buf []byte) ([] byte) { ctx := md4.New() ctx.Write(buf) return ctx.Sum(nil) } func main() {

Java程序员的Golang入门指南(上)

Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如果有人说X语言比Y语言好,两方的支持者经常会激烈地争吵.如果你是某种语言老手,你就是那门语言的"传道者",下意识地会保护它.无论承认与否,你都已被困在一个隧道里,你看到的完全是局限的.<肖申克的救赎>对此有很好的注脚: [Red] These walls are funny.

golang学习笔记:golang 语法篇(二)

在语法篇(一)中学习了go中基本的数据类型.变量.常量等组成语言的基本要素,在这一节中将会学习如何将这些元素组织起来,最终写成可以执行的代码. 在这一部分包括: go中的流程控制语句: go中函数的用法: go特殊的错误处理方式: Golang中的流程控制语句 在具体编程的时候免不了需要使用一些特殊的语句实现某些功能,比如使用循环语句来进行迭代,使用选择语句控制程序的执行方式等.这些语句在任何一门程序设计语言 中都会有支持,golang中除了支持常用的循环,条件选择语句以外,还支持跳转语句,下面

Golang关键字—— if/else

Golang中,if/else 关键字用于条件判断,如果满足条件就做某事,否则做另一件事: if age >= 18 { fmt.Println("成年人") } else { fmt.Println("未成年") } 多重判断: if score >= 90 { fmt.Println("优秀") } else if score >= 70 { fmt.Println("良好") } else if sco