Go 不同于其他语言的九个特性_go 相比其他语言的特点

        break                         
    }                        
}                       

}


在上面的例子中,文件关闭方法被推迟了。我喜欢这种在函数顶部声明你的内务处理意图的模式,然后忘记它,知道一旦函数退出它就会完成它的工作。


### 5. Go 采用了函数式编程的最佳特性


函数式编程是一种高效且富有创造性的范式,幸运的是 Go 采用了函数式编程的最佳特性。在Go中:


* 函数是值,这意味着它们可以作为值添加到映射中,作为参数传递给其他函数,设置为变量,并从函数返回(称为“高阶函数”,在 Go 中经常使用装饰器创建中间件图案)。
* 可以创建和自动调用匿名函数。
* 在其他函数内声明的函数允许闭包(在函数内声明的函数能够访问和修改在外部函数中声明的变量)。在惯用的 Go 中,闭包被广泛使用来限制函数的范围,并设置函数然后在其逻辑中使用的状态。



func StartTimer (name string) func(){
t := time.Now()
log.Println(name, “started”)
return func() {
d := time.Now().Sub(t)
log.Println(name, “took”, d)
}
}
func RunTimer() {
stop := StartTimer(“My timer”)
defer stop()
time.Sleep(1 * time.Second)
}


上面是一个闭包的例子。‘StartTimer’ 函数返回一个新函数,它通过闭包可以访问在其出生范围内设置的 ‘t’ 值。然后,此函数可以将当前时间与“t”的值进行比较,从而创建一个有用的计时器。感谢Mat Ryer的这个例子。


### 6. Go 有隐式接口


任何阅读过有关SOLID编码和设计模式的文献的人都可能听说过“优先组合胜过继承”的口头禅。简而言之,这表明您应该将业务逻辑分解为不同的接口,而不是依赖于来自父类的属性和逻辑的分层继承。


另一个流行的方法是“为接口编程,而不是实现”: API 应该只发布其预期行为的契约(其方法签名),而不是有关如何实现该行为的详细信息。


这两者都表明接口在现代编程中的重要性。


因此,Go 支持接口也就不足为奇了。事实上,接口是 Go 中唯一的抽象类型。


然而,与其他语言不同,Go 中的接口不是显式实现的,而是隐式实现的。具体类型不声明它实现了接口。相反,如果为该具体类型设置的方法集包含底层接口的所有方法集,则Go 认为该对象实现了 interface。


这种隐式接口实现(正式称为结构类型)允许 Go 强制执行类型安全和解耦,保持动态语言中表现出的大部分灵活性。


相比之下,显式接口将客户端和实现绑定在一起,例如,在 Java 中替换依赖项比在 Go 中困难得多。



// 这是一个接口声明(称为Logic)
type Logic interface {
Process (data string) string
}

type LogicProvider struct {}
// 这是 LogicProvider 上名为“Process”的方法 struct
func (lp LogicProvider) Process (data string) string {
// 业务逻辑
}
// 这是具有 Logic 接口作为属性的客户端结构
type Client struct {
L Logic
}
func(c Client) Program() {
// 从某处获取数据
cLProcess(data)
}
func main() {
c := Client {
L: LogicProvider{},
}
c.Program()
}


LogicProvider 中没有任何声明表示它符合Logic接口。这意味着客户端将来可以轻松替换其逻辑提供程序,只要该逻辑提供程序包含底层接口 ( Logic ) 的所有方法集。


### 7.错误处理


Go 中的错误处理方式与其他语言大不相同。简而言之,Go 通过返回一个 error 类型的值作为函数的最后一个返回值来处理错误。


当函数按预期执行时,错误参数返回nil,否则返回错误值。调用函数然后检查错误返回值,并处理错误,或抛出自己的错误。



// 函数返回一个整数和一个错误
func calculateRemainder(numerator int, denominator int) ( int, error ) {
//
if denominator == 0 {
return 9, errors.New(“denominator is 0”
}
// 没有错误返回
return numerator / denominator, nil
}


Go 以这种方式运行是有原因的:它迫使编码人员考虑异常并正确处理它们。传统的 try-catch 异常还会在代码中添加至少一个新的代码路径,并以难以遵循的方式缩进代码。Go 更喜欢将“快乐路径”视为非缩进代码,在“快乐路径”完成之前识别并返回任何错误。


### 8.并发


可以说是 Go 最著名的特性,并发允许处理在机器或服务器上的可用内核数量上并行运行。当单独的进程不相互依赖(不需要顺序运行)并且时间性能至关重要时,并发性最有意义。这通常是 I/O 要求的情况,其中读取或写入磁盘或网络的速度比除最复杂的内存中进程之外的所有进程慢几个数量级。  
 函数调用前的“ go ”关键字将同时运行该函数。



func process(val int) int {
// 用 val 做一些事情
}
// 对于 ‘in’ 中的每个值,同时运行 process 函数,
// 并将 process 的结果读取到 ‘out’
func runConcurrently(in <-chan int, out chan<- int){
go func() {
for val := range in {
result := process(val)
out <- result
}
}
}


Go 中的并发是一项深入且相当高级的功能,但在有意义的地方,它提供了一种有效的方法来确保程序的最佳性能。


### 9. Go 标准库


Go 有一个“包含电池”的理念,现代编程语言的许多要求都被纳入标准库,这使程序员的生活变得更加简单。  
 如前所述,Go 是一种相对年轻的语言,这意味着标准库中可以满足现代应用程序的许多问题/要求。


一方面,Go 为网络(特别是 HTTP/2)和文件管理提供了世界一流的支持。它还提供原生 JSON 编码和解码。因此,设置服务器来处理 HTTP 请求并返回响应(JSON 或其他)非常简单,这解释了 Go 在基于 REST 的 HTTP Web 服务开发中的流行。


正如Mat Ryer还指出的那样,标准库是开源的,是学习 Go 最佳实践的绝佳方式。


### ⭐️ 好书推荐


**《Go编程进阶实战:开发命令行应用、HTTP应用和gRPC应用》**


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2ea5ff66fea840cf851b5363cdc1959b.png)


【内容简介】


主要内容


● 编写命令行应用程序  
 ● 编写HTTP服务和客户端  
 ● 使用gRPC编写RPC应用程序  
 ● 为网络客户端和服务器编写中间件  
 ● 在云对象存储和SQL数据库中存储数据  
 ● 使用惯用的技术测试应用程序  
 ● 为应用程序增加可观察性  
 ● 管理应用程序的配置数据


📚 京东购买链接:[《Go编程进阶实战:开发命令行应用、HTTP应用和gRPC应用》]( )







## 学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7a04c5d629f1415a9e35662316578e07.png#pic_center)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值