前情提要
上一章我们初步运行了go,写了一些简单的函数,这章我们重点讲一下变量和函数。因为之前有点忙,一直没有空更,现在空闲下来了,给大家更新一下入门的第二章。
PS:没看过的第一章的小伙伴,可以进入下面的链接查看
从JavaScript入门Go一
Go中的变量
首先我们来明确一下变量是什么,变量是用来存储数据的标识符,可以存储各种类型的数据,包括数字、字符串、数组、JSON等。其本质就是为数据分配内存空间,这样程序就可以在需要的时候存储和操作数据。
变量的定义与类型判断
首先JavaScript和Go都是使用 var 作为定义变量的关键字,其次两项语言都具备识别值类型的功能,如下示例
// JavaScript
var a = "字符"
console.log(typeof a) // "string"
// Go
package main
import "fmt"
func main() {
var a = "字符"
fmt.Printf("%T", a) // string
}
从上述示例我们可以看出来,两项语言定义变量的语法毫无差别,这其实是Go兼容了JavaScript的语法。在golang中还有许多其他定义变量的写法,这里我们先不去进行探讨,毕竟是以JavaScript去入门,我们先保持JavaScript的语法习惯。
变量的赋值
在我们的 JavaScript 中,变量赋值一种类型后,是可以再赋值其他任意类型值的。但在Go中则不同,Go只能根据给变量定义的类型或变量第一次被赋值的值类型定义。如下示例
// JavaScript
var a = "字符"
console.log(typeof a) // string
a = 1
console.log(typeof a) // number
a = [1]
console.log(typeof a) // object
// Go
package main
import "fmt"
func main() {
var a = "字符"
var b int
fmt.Printf("%T\n", a) // string
fmt.Printf("%T\n", b) // int
// 以下代码会提示类型错误
// a = 1
// b = "字符"
}
之所以发生如上情况,是因为JavaScript属于动态语言,其可以在运行过程中对变量进行解释。而GO是静态语言,其只能在编译过程中进行判断。
总结
看了JavaScript与Go中的变量,我们可以知道两项语言在语法的定义上几乎没有差别,Go中兼并了JavaScript的语法。不同点仅是在后续的赋值上的差别,这也是动态语言和镜头语言特性的不同。所以我们实际入门开发的话,按照JavaScript的语法习惯去书写定义即可,只是要注意后续赋值时,不同类型一定要进行转换,而不要直接使用。如下示例
// Go
package main
import "fmt"
func main() {
var a = 20.5
var b = 11
fmt.Println(a+float64(b)) // 用float转化一下
}
PS:这里对Go变量类型感兴趣的小伙伴,点这个链接去官方看一下都有什么类型,这里就不细说了
Go中的函数
函数是计算机语言中重要的一部分,一般由三部分组成语法、参数、返回值,不管什么语言中我们都能看到。其实它的本质就是是一段独立的代码块,可以执行一个特定的任务并返回一个值。使用它的主要目的就是将复杂的程序逻辑分解为更小、更易于管理的部分,以提高代码的可读性和可维护性。
函数的语法
Go中函数的语法其实和JavaScript基本一致,只是关键字不同,在Go中函数的关键字是 func 而JavaScript是function。如下示例
// JavaScript
function a(){
console.log('函数')
}
a()
// Go
package main
import "fmt"
func a(){
fmt.Printf("函数")
}
func main() {
a()
}
其实从这样看,Go是JavaScript函数关键字的缩略版,更好记一些。
函数的参数
Go中函数参数的位置与JavaScript中一样,都在定义函数的 () 中,唯一需要注意的是在Go中函数所有的参数,都必须要有定义明确的类型。如下所示
// JavaScript
function a(b){
console.log(b)
}
a("测试") // 输出"测试"
a(1) // 输出1
// Go
package main
import "fmt"
func a(b string){
fmt.Printf(b)
}
func main() {
a("测试") // 输出"测试"
// a(1) 类型报错
}
从示例中我们可以看出,JavaScript相较Go来说,函数的参数传递更为自由,可以传入不同类型变量。而Go中的参数都要强制的类型规定,咱们写惯了JavaScript的这么写起来可能束手束脚,其实不然这种明确的类型定义,写起来代码更不容易出现问题,咱们回忆一下在和其他前端同学合作时,是不是经常出现参数类型的错误,你想要字符其他同学传了个数字,导致后续代码出现问题,还需要额外进行类型的处理,所以这样其实是一种更严谨的写法,少了许多处理问题。
函数的返回值
Go中函数返回值的关键字是 return 这点和JavaScript是一致的。不同的点是,在Go中所有的返回值都必须在函数声明时标记,且Go中函数的返回值可以有多个。而不像JavaScript一样,返回值只有一个且可以是任意类型。如下示例
// JavaScript
function a(){
console.log('函数')
return 1
}
a()
// Go
package main
import "fmt"
// 必须定义为int和string
func a() (int,string) {
fmt.Printf("函数")
return 1,"测试"
}
func main() {
a()
}
从上述示例中我们可以看出JavaScript和Go在返回值中的区别,我们刚入门Go时可能会感觉写法比较啰嗦,每次都要加一个类型,其实用的时间长了你会感觉这样很舒服,一个明确的返回类型可以让代码维护性更高,不会出现返回值不同需要判断的问题。
至于多个返回值,这其实是Go的一个特性,因为在Go的编码中,经常会遇到判断函数是否运行的问题。一般我们判断一个函数是否成功,都是需要至少两个返回类型来判断的,一个用来判断运行是否正常,一个用来接收返回结果,如下示例。
// Go
package main
import "fmt"
func a(x int) (bool,string) {
if x == 1{
return true,"result"
}else{
return false,"error"
}
}
func main() {
var ok,res = a(1)
if ok {
fmt.Println("成功了结果是",res)
}else{
fmt.Println("运行失败了")
}
}
总结
从上面这些例子可以看出JavaScript和Go函数的大体区别,其实在语法上两者差别不多,只是在Go中更强调了类型声明。比如参数和返回值,这些在JavaScript都是可自由定义的。这种写法其实是语言特性导致的,就跟我在变量里说的一样Go作为静态语言,其无法像JavaScript那样动态解释判断类型,所以必须提前定义好。这样的定义咱们写惯了前端的人来说,可能会很不舒服,但其实这是更严谨的写法,不仅方便后期维护,也在无形中少了很多类型处理的问题。
按特点小分一下(这样更清晰):
1.语法上Go使用func,JavaScript使用function定义函数
2.参数上Go的参数必须定义好类型,JavaScript只需定义参数名
3.返回值上Go的返回值必需在函数上声明,并且必须严格按照定义类型返回,数量上可以是多个。而在JavaScript中不需要声明返回值及类型,但其返回值也只能是返回一个。
后话
博主也是一个Go语言萌新,有什么理解不对或者不全面的地方欢迎大佬指出。当然有小伙伴有什么问题,也可以在下面评论,咱们一起讨论。后续的第三章,等后面不忙了我再更新,目前的想法是讲讲if、for、switch这些逻辑语法。