体验golang语言的风骚编程

简介:

最近想搞搞后台开发,话说注意力就转移到了公司用的golang。用Go做微服务比较方便,或许是因为golang强悍的语法吧,看到go的语法,自己已被深深的吸引。

来我们一起感受下Go的风骚式的代码风格。

1、魔鬼式变量声明

46b0963650c8160711f8e3e21d2fce10ae14bd9f
2、数组的声明

8907502d943ec586d428e3ffca5fb0b3264155ea

array就是数组,它的定义方式如下:

var arr [n]type

在[n]type中,n表示数组的长度,type表示存储元素的类型。对数组的操作和其它语言类似,都是通过[]来进行 读取或赋值:


var arr [10]int // 声明了一个int类型的数组 
arr[0] = 42 // 数组下标是从0开始的 
arr[1] = 13 // 赋值操作 
fmt.Printf("The first element is %d\n", arr[0]) // 获取数据,返回42 
fmt.Printf("The last element is %d\n", arr[9]) //返回未赋值的最后一个元素,默认返回0

由于长度也是数组类型的一部分,因此[3]int与[4]int是不同的类型,数组也就不能改变长度。数组之间的赋值是 值的赋值,即当把一个数组作为参数传入函数的时候,传入的其实是该数组的副本,而不是它的指针。如果要使用指 针,那么就需要用到后面介绍的slice类型了。

数组可以使用另一种:=来声明


a := [3]int{123// 声明了一个长度为3的int数组 
b := [10]int{123// 声明了一个长度为10的int数组,其中前三个元素初始化为1、2、3,其它默认为0 
c := [...]int{456// 可以省略长度而采用`...`的方式,Go会自动根据元素个数来计算长度

3、 go语言强大的slice操作

golang 中的 slice 非常强大,让数组操作非常方便高效。在开发中不定长度表示的数组全部都是 slice 。但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果就是在实际开发中碰到很多坑,以至于出现一些莫名奇妙的问题,数组中的数据丢失了
slice 的数据结构,它很简单,一个指向真实 array 地址的指针 ptr ,slice 的长度 len 和容量 cap 。

e60d544d4123baa975486b066f09db51995311d9

其中 len 和 cap 就是我们在调用 len(slice) 和 cap(slice) 返回的值。

我们来按照 slice 的数据结构定义来解析出 ptr, len, cap

// 按照上图定义的数据结构


type Slice struct {
ptr unsafe.Pointer // Array pointer
len int // slice length
cap int // slice capacity

示例代码

5777114f55c146f2b4cbd08b06c89dad33cc2f05
4、map的声明

注意由于go语言是一个强类型的语言,因此hashmap也是有类型的,具体体现在key和value都必须指定类型,比如声明一个key为string,value也是string的map,
需要这样做

e394dfcdd7b9a95f416ea3e13022c8ce2e585ed8

go语言中的枚举

b9f3da7bae14c4dc5b8b6d647435be6e1ed6d3d4
5、for循环的遍历


func formapTest() {
var arrayi= [...] int{123456778910}
for index, c := range arrayi {
fmt.Printf("array[%d] = %d", index, c)
}

str := "go语言的学习和啪啪"
for i, ch := range str {
fmt.Println(i, ch) //ch的类型为rune unicode编码
}
//输出为:28907 (Unicode编码时,两个字节代表一个字符)

n := len(str)
for i := 0; i < n; i++ {
ch := str[i] // 依据下标取字符串中的字符,类型为byte
fmt.Println(i, ch)
//输出为utf-8编码,一个汉字字符占三个字节
}

array := []rune(str)
n = len(array)
for i := 0; i < n; i++ {
ch := array[i] // 依据下标取字符串中的字符,类型为byte
fmt.Println(i, ch) //unicode 编码转十进制输出
//golang中字符类型的实际数据类型为uint32,以for循环遍历的方式输出结果都是Unicode编码的
}
//var str string= "yyh,hello,卡卡论坛,好厉害哦"
//fmt.Print(str)
fmt.Print("\n================================\n")
for i , ch := range str{
//fmt.Printf("(%d, %c)",i,ch)
fmt.Printf("(%d, %x)",i,ch)
}

fmt.Print(utf8.RuneCountInString(str))
fmt.Print("================================\n")
bytes := [] byte(str)

//for len(bytes) > 0 {
r, size := utf8.DecodeRune(bytes)
fmt.Printf("%c %d",r,size)
//}
fmt.Println()
fmt.Println()
fmt.Println()
for i,c := range bytes{

r,_ :=utf8.DecodeRune(bytes)
fmt.Printf("%d %c %x \n",i,r,c)
}
for i ,ch := range []rune(str){
fmt.Printf("%d: %c ",i,ch)
}

str2 := "123 我按时 的发ad fg票 是否 adfg 发 发生a f发 的sj df"
sps := strings.Split(str2," ")
sps = strings.Fields(str2)
var isContact = strings.Contains(str2,"你们")
fmt.Println(sps)
fmt.Println(isContact)
}

6、 golang中的结构体和继承

2519bacafc18d6b5a12e242784baa0ec372c8061

7、 golang中的接口

3e07899e142766b1d63f810b1b3acf884f2fe0d4

8、 golang中的空interface

类似于java中的object,空interface(interface{})不包含任何的method,正因为如此,所有的类型都实现了空interface。空interface对于
描述起不到任何的作用(因为它不包含任何的method),但是空interface在我们需要存储任意类型的数值的时候相当有用,因为它可以存储任意类型的数值。它有点类似于C语言的void*类型。

ab3224153f50c93c5796331d6e743066d44dd49e

一个函数把interface{}作为参数,那么他可以接受任意类型的值作为参数,如果一个函数返回interface{},那么也
就可以返回任意类型的值。是不是很有用啊!
9、结构体中可以定义字段,但接口不行

structs与interfaces不能具有相同的API,因为interfaces无法定义字段。这个问题并算很大,因为可以在接口中定义getter和setter方法,虽然这有点混乱。 eg:

c202a2ba0a3165e382d56c5ffda32e0af36181e7
10、Public和Private命名

Golang将Python的public和private方法命名方案做了进一步发展。当我最初发现以大写字母开头的函数、结构体是public,而小写开头的则是private的时候, 感觉不可思议,但我很享受这种语法。


type PublicStructName struct {} //public 外部能调用
type privateStructName struct {} // 私有 结构体,仅内部函数能调用


原文发布时间为:2018-10-10

本文作者:yuer

本文来自云栖社区合作伙伴“终端研发部”,了解相关信息可以关注“终端研发部”。

相关文章
|
4天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
29 0
|
1天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
9 1
|
1天前
|
Go
|
2天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
131 1
|
2天前
|
算法 关系型数据库 MySQL
Go语言中的分布式ID生成器设计与实现
【5月更文挑战第6天】本文探讨了Go语言在分布式系统中生成全局唯一ID的策略,包括Twitter的Snowflake算法、UUID和MySQL自增ID。Snowflake算法通过时间戳、节点ID和序列号生成ID,Go实现中需处理时间回拨问题。UUID保证全局唯一,但长度较长。MySQL自增ID依赖数据库,可能造成性能瓶颈。选择策略时需考虑业务需求和并发、时间同步等挑战,以确保系统稳定可靠。
109 0
|
2天前
|
缓存 NoSQL Go
Go语言中的分布式锁实现与选型
【5月更文挑战第6天】本文探讨了Go语言中分布式锁的实现,包括Redis、ZooKeeper和Etcd三种方式,强调了选型时的性能、可靠性和复杂度考量。通过代码示例展示了Redis分布式锁的使用,并提出了避免死锁、公平性等问题的策略。结论指出,开发者应根据业务需求选择合适实现并理解底层原理,以确保系统稳定和高效。
125 0
|
2天前
|
NoSQL 算法 Go
Go语言中的分布式事务处理方案
【5月更文挑战第6天】本文探讨了Go语言在分布式事务处理中的应用,包括2PC、3PC和TCC协议。通过示例展示了如何使用Go的`goroutine`和`channel`实现2PC。同时,文章指出了网络延迟、单点故障、死锁和幂等性等常见问题,并提供了相应的解决策略。此外,还以Redis Redlock为例,展示了如何实现分布式锁。理解并实施这些方案对于构建高可用的分布式系统至关重要。
96 0
|
3天前
|
缓存 测试技术 持续交付
Golang深入浅出之-Go语言中的持续集成与持续部署(CI/CD)
【5月更文挑战第5天】本文介绍了Go语言项目中的CI/CD实践,包括持续集成与持续部署的基础知识,常见问题及解决策略。测试覆盖不足、版本不一致和构建时间过长是主要问题,可通过全面测试、统一依赖管理和利用缓存优化。文中还提供了使用GitHub Actions进行自动化测试和部署的示例,强调了持续优化CI/CD流程以适应项目需求的重要性。
42 1
|
3天前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
40 1
|
3天前
|
负载均衡 监控 Go
Golang深入浅出之-Go语言中的服务网格(Service Mesh)原理与应用
【5月更文挑战第5天】服务网格是处理服务间通信的基础设施层,常由数据平面(代理,如Envoy)和控制平面(管理配置)组成。本文讨论了服务发现、负载均衡和追踪等常见问题及其解决方案,并展示了使用Go语言实现Envoy sidecar配置的例子,强调Go语言在构建服务网格中的优势。服务网格能提升微服务的管理和可观测性,正确应对问题能构建更健壮的分布式系统。
25 1