未加星标

Go 语言入门(与js类比)

字体大小 | |
[前端(javascript) 所属分类 前端(javascript) | 发布者 店小二04 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏
前言

回学校的这么长时间竟然没有写过超过300行的代码。这日子实在是太颓废了。

SICP 暂时看不下去,那么多题静不下心。

可是最近是真的无聊就说新学一门语言吧,刚好公司在用 Go,而且大家都说 Go 语言不错,我就准备学了一下。

变量

现在的新语言似乎都不大愿意写冗长的变量声明了。

// 显示声明一个变量的类型 var foo int = 1 // 自动推导 foo := 1

大部分情况下 foo := 1 的这种短语法就挺好用的

不过我个人对于这个语法还是不喜欢,因为。。。 : 和 = 在键盘上离得好远啊!

js 因为是弱类型的,不需要声明类型。好像会舒服一些。

let a = 1

循环

循环贼灵活,全程都是 for 来做的。

for { // do some stuff } for variable < 1 { variable++ } for i := 0; i < 1 ; i++ { // do some stuff }

上面的分别是死循环,条件判定,完整循环。语法就这个样子,对应的js类似于下面的:

while(1) { // 第一个 for } while (variable < 1) { // 第二个 for } for (let i = 0; i < 1; i++) { // 第三个 for }

现在就好理解很多了。

还有遍历map, slice什么的:

for key, value := range someMap { // do some stuff }

对应的 js 是这个样子

for (let key in someMap) { let value = someMap[key] // do some stuff } 结构体

结构体和 C 语言很像

type Foo struct { x int y int }

结构体可以挂在方法。

func (foo *Foo) Print() { fmt.Println("foo") }

常写js的你肯定想到了什么对吧,这和原型链好像啊!

let Foo = function() {} Foo.prototype.Print = function() { console.log('foo') }

简直不要太亲切!

map

键值对这样的数据在Go中怎么实现是我初学的时候想问的。

foo := map[string]bool{ "hello": true, "world": false }

类似于js中的:

let foo = { "hello": true, "world": false }

是不是特别的亲切~

slice

可变数组,在 Go 中叫“切片”

反正有用就是了。

foo := []string{"hello", "world"}

类似于 js 中的

let foo = ['hello', 'world'] defer

这个关键词可以自动延迟执行。

比如打开一个文件,可以立即写一个 defer 以防后面忘记

file, err := os.Open("file.txt") defer file.Close()

js里似乎没有这么牛逼的功能。有点儿叼的。

Function

定义函数很多种方法。

虽说 Go 语言并不是一门函数式语言,但是却也实现了很多函数式语法:

比如:

someFunc := func() (func() int) { // do some stuff return func() { // return a function return 1 } }

相似的是

let someFunc = () => () => 1

只是 Go 语言是强类型的,所以要在函数声明的时候加上参数列表

对了,首字母大写的表示是暴露出的接口,小字母的是非暴露的。就是 public 和 private 的区别。

那么,自执行函数呢,Go 也有!

foo := func() int { return 1 }()

对应的 js 是这样的:

let foo = (function() { return 1 })()

Go 还有叼叼的多返回值,到这里我就特别想Node也有。

func Hello() (result string, status int) { return "hello world", 0 } res, status := Hello()

相信我,你会爱上它的

还有 Go 的独有的,牛逼的 go 关键字:

names := []string{"Keyle", "Tom", "AnnatarHe"} for _, v := range names { go func() { fmt.Printf("Hello, %s", v) } }

go 会放到另一个Goroutine中执行,就算不明白什么意思,但是我也觉得一名合格的前端也应该立刻觉得哪里不对。

哈哈,是的。和一些著名的js面试题一样,因为进行的很快,所以最后只会输出“AnnatarHe”,我猜你看到这里应该会改了哦~

go func(name) { fmt.Printf("Hello, %s", name) }(v)

附上烂大街的js面试题:

for (var index = 0; index < 5; index++) { setTimeout(function() { console.log(index) }, 500) }

End

好了,后面的 Goroutine 和 channel 我还没有完全看懂,毕竟只学了不到一周。

只是觉得和js很像,所以记一下自己所学。

一定要注意,文中的表述并不是完全准确地,如果对 Go 语言感兴趣请去看专业的书籍和官方文档哦。

References 图灵原创:Go并发编程实战 Thanks iOTA

本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程

主题: 数据面试变量
分页:12
转载请注明
本文标题:Go 语言入门(与js类比)
本站链接:http://www.codesec.net/view/485518.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 前端(javascript) | 评论(0) | 阅读(19)