体验go语言的风骚式编程
最近想搞搞后台开发,话说注意力就转移到了公司用的golang。用Go做微服务比较方便,或许是因为golang强悍的语法吧,看到go的语法,自己已被深深的吸引。关于学习后台如何选择可以参考《做后台是选择Java 、Go ,还是 PHP?》
来我们一起感受下Go的风骚式的代码风格。
1、魔鬼式变量声明
2、数组的声明
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{1, 2, 3} // 声明了一个长度为3的int数组
b := [10]int{1, 2, 3} // 声明了一个长度为10的int数组,其中前三个元素初始化为1、2、3,其它默认为0
c := [...]int{4, 5, 6} // 可以省略长度而采用`...`的方式,Go会自动根据元素个数来计算长度
3、 go语言强大的slice操作
golang 中的 slice 非常强大,让数组操作非常方便高效。在开发中不定长度表示的数组全部都是 slice 。但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果就是在实际开发中碰到很多坑,以至于出现一些莫名奇妙的问题,数组中的数据丢失了
slice 的数据结构,它很简单,一个指向真实 array 地址的指针 ptr ,slice 的长度 len 和容量 cap 。
其中 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
示例代码
4、map的声明
注意由于go语言是一个强类型的语言,因此hashmap也是有类型的,具体体现在key和value都必须指定类型,比如声明一个key为string,value也是string的map,
需要这样做
go语言中的枚举
5、for循环的遍历
func formapTest() {
var arrayi= [...] int{1, 2, 3, 4, 5, 6, 7, 78, 9, 10}
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中的结构体和继承
7、 golang中的接口
8、 golang中的空interface
类似于java中的object,空interface(interface{})不包含任何的method,正因为如此,所有的类型都实现了空interface。空interface对于
描述起不到任何的作用(因为它不包含任何的method),但是空interface在我们需要存储任意类型的数值的时候相当有用,因为它可以存储任意类型的数值。它有点类似于C语言的void*类型。
一个函数把interface{}作为参数,那么他可以接受任意类型的值作为参数,如果一个函数返回interface{},那么也
就可以返回任意类型的值。是不是很有用啊!
9、结构体中可以定义字段,但接口不行
structs与interfaces不能具有相同的API,因为interfaces无法定义字段。这个问题并算很大,因为可以在接口中定义getter和setter方法,虽然这有点混乱。 eg:
10、Public和Private命名
Golang将Python的public和private方法命名方案做了进一步发展。当我最初发现以大写字母开头的函数、结构体是public,而小写开头的则是private的时候, 感觉不可思议,但我很享受这种语法。
type PublicStructName struct {} //public 外部能调用
type privateStructName struct {} // 私有 结构体,仅内部函数能调用
最后
今天就先到这里,golang语法很多,这里只是其中的冰山一角。如果大家想学习golang,我这里推荐:https://github.com/Unknwon/the-way-to-go_ZH_CN
体验go语言的风骚式编程的更多相关文章
- AngularJS体验式编程系列文章
AngularJS体验式编程系列文章,将介绍如何用angularjs构建一个强大的web前端系统.angularjs是由Google团队开发的一款非常优秀web前端框架.在当前如此多的web框架下,a ...
- jQuery插件编写及链式编程模型
jQuery插件编写及链式编程模型小结 JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我 ...
- 【响应式编程的思维艺术】 (1)Rxjs专题学习计划
目录 一. 响应式编程 二. 学习路径规划 一. 响应式编程 响应式编程,也称为流式编程,对于非前端工程师来说,可能并不是一个陌生的名词,它是函数式编程在软件开发中应用的延伸,如果你对函数式编程还没有 ...
- 什么是响应式编程——响应式Spring的道法术器
响应式编程之道 1.1 什么是响应式编程? 在开始讨论响应式编程(Reactive Programming)之前,先来看一个我们经常使用的一款堪称“响应式典范”的强大的生产力工具——电子表格. 举个简 ...
- 响应式编程(Reactive Programming)(Rx)介绍
很明显你是有兴趣学习这种被称作响应式编程的新技术才来看这篇文章的. 学习响应式编程是很困难的一个过程,特别是在缺乏优秀资料的前提下.刚开始学习时,我试过去找一些教程,并找到了为数不多的实用教程,但是它 ...
- 第三单元总结——JML契约式编程
OO第三单元博客作业--JML与契约式编程 OO第三单元的三次作业都是在课程组的JML规格下完成.完成作业的过程是契约式编程的过程:设计者完成规格设计,实现者按照规格具体实现.作业正确性的检查同样围绕 ...
- PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程
PHP高级程序设计 学习笔记 2014.06.09 什么是面向对象编程 面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构.OOP 的一条基本原则是计算 ...
- iOS开发--Swift RAC响应式编程初探
时间不是很充足, 先少说点, RAC的好处是响应式编程, 不需要自己去设置代理委托, target, 而是主要以信息流(signal), block为主, 看到这里激动吧, 它可以帮你监听你的事件, ...
- .Net中的反应式编程(Reactive Programming)
系列主题:基于消息的软件架构模型演变 一.反应式编程(Reactive Programming) 1.什么是反应式编程:反应式编程(Reactive programming)简称Rx,他是一个使用LI ...
随机推荐
- MySQL的一些基本命令笔记(1)
关系型数据库的建模构建块: 1.数据是以行和列的形式存储数据. 2.这一系列的行和列称为表(关系) 3.表中的每一行表示一条记录(元组) 4.表中的每一列表示记录的一个属性 5.一组表组成了数据库 6 ...
- TypeScript 快速学习
https://learnxinyminutes.com/docs/zh-cn/typescript-cn/ https://www.tslang.cn/docs/handbook/basic-typ ...
- Docker 容器CPU设置
CPU使用率其实就是你运行的程序占用的CPU资源,表示你的机器在某个时间点的运行程序的情况.使用率越高,说明你的机器在这个时间上运行了很多程序,反之较少.CPU使用率的高低与你的CPU强弱有直接关系. ...
- JavaScript之正则表达式[应用实例]
1. 获取信息 "水资源利用与保护周三第9,10,11节{第1-6周}施浩然3B-302多媒体教室152座信息检索周三第9,10节{第9-12周}谭长拥4A-207多媒体160座{第12周} ...
- url编码解码的问题(urlencode/quote)
import urllib.parse params = { "wd":"hello人工智能" } # 将字典形式的进行编码 query_str = urlli ...
- LOJ #6268 分拆数
不会五边形数的菜鸡的分块乱搞 LOJ #6268 题意 求前$ n$个数的整数划分方案数,$ n \leq 10^5$ $ Solution$ 考虑暴力$ DP$ $ f(x,y)$表示放了$ x$个 ...
- Leetcode#832. Flipping an Image(翻转图像)
题目描述 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]. ...
- android4.4之后的HttpUrlConnection的实现是基于okhttp
首先看HttpUrlConnection使用 URL url = new URL("http://www.baidu.com"); HttpURLConnection urlCon ...
- ActiveMQ静态网络链接(broker-to-broker)
ActiveMQ的网络连接分为静态连接和动态连接.本章研究静态连接. 1.ActiveMQ的networkConnector是什么 在某些情况下,需要多个ActiveMQ的Broker做集群,那么就涉 ...
- Vue -自定义指令&钩子函数
除了核心功能默认内置的指令,Vue也允许注册自定义指令 页面加载后,让文本框自动获取焦点,原生js做法是获取文本框元素后调用focus()方法,但Vue不建议手动操作DOM元素,所以此时要自定义指令 ...