go语言学习第一弹:go和php的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LJFPHP/article/details/88560718

一、前言

      go语言也出来有一些年头了,按理说我们身为程序员,是应该身先士卒的去学习它,奈何博主之前总是不敢学,害怕php都掌握的不牢靠,学go语言相当于邯郸学步,最后把php都给忘了(博主刚入行一年的时候学习python,结果写程序的时候果断弄混了,哈哈哈)。

      行吧,趁着最近闲下来,看了一些go的入门文档,这边稍微总结下gophp的区别吧,都是比较浅显的一些区别,不涉及原理,只是入门笔记~

二、正文

1、 go程序不用在每行的后面加分号:;

2、 go程序的函数括号: { 不能单独在一行,不然会报错

3、 go程序的派生类型比较多,且对于数据类型的定位更为精准。比如int和uint,int8等,比起php只有一个int类型,go要严谨的多

4、 go每增加一个新变量都是要显式声明的,比如 var a int = 50; 也可以用 a :=50;来声明。php使用变量是不用声明的

go声明变量的例子:
	b := false //布尔型
	i := 1 //整型
	f := 0.618 //浮点型
	c := 'a' //字符
	s := "hello" //字符串
	cp := 3+2i  //复数 
	i := [3]int{1,2,3} //数组   (特别注意下数组的声明格式: arr := []int{})

5、 go声明变量之后,不指明变量类型的话,则会自己推断所属类型。如果给出类型,例如 var x,y int 此处没有给出x,y指定的值,则默认为0。bool类型的默认值为:false

6、 在go中,全局变量声明之后,可以不被使用。如果是方法体中的局部变量,声明之后必须要在下面使用,不然会编译错误

7、 go中有个空白标识符,也被用于抛弃值:空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。

8、 go中相同类型之间的变量可以同时声明,例如:var x,y int 如果类型不同的话,不能同时声明,不然编译报错

9、 go中的常量可以通过枚举,一个const定义多个常量。常量中的赋值部分也可以采用go内置的一些函数来进行计算。不是内置函数则编译失败。如果没有给常量定义值
则会默认使用上一个被定义的常量的值,例如:

	const (
		a = 1
			b
			c
		   d
		)      
		打印出来的结果为:1 , 1 ,1 ,1  (如果定义b =2,则打印结果的c和d都为2,会默认使用上一个被定义的常量的值)

10、 字符串类型在 go 里是个结构, 包含指向底层数组的指针和长度,这两部分每部分都是 8 个字节,所以字符串类型大小为 16 个字节。a = “hello” unsafe.Sizeof(a)//16

11、 go中的" i=1<<0, j=3<<1"这里的"<<"代表左移,即i=1:左移 0 位,不变仍为 1; j=3:左移 1 位,变为二进制 110, 即 6; (变成二进制了)

12、 go的位运算符是二进制之间的计算,需要先熟练掌握二进制之间的算法!!!!!

13、 关于go的fmt包格式化字符串的格式参数:https://blog.csdn.net/tennysonsky/article/details/77988969 (类似于 %T 可以输出变量的类型int,string等)

14、 关于go中的&a是取变量a对应的内存地址。

	& :仅用于生成其操作数对应的地址,也就是用于生成指针
	* :会出现在两个内容上:
		一个是类型, * Type 这样的格式代表了一个指针类型
		一个是指针, * Pointer 这样的格式用于获取指针所对应的基本值

15、 go的循环语法和php差不多,多了一个select循环,类似于switch循环,只不过select循环中的case都是要进行io操作的,而且当case都不满足条件的时候,会堵塞

参考博客:https://blog.csdn.net/wo198711203217/article/details/65442288

      其次是go中的语言条件语句的条件部分是没括号的。例如: if 布尔表达式 { } 这里的条件部分是没括号的

16、 go的函数是通过func来定义的,且函数的参数,返回值等都需要定义好类型。也可以定义返回多个值的类型,例如:

func swap(x, y string) (string, string) {
 return y, x
}

      而php的函数是通过function来定义的。虽然php 7.0之后也可以定义返回类型,但是定义返回类型的格式稍有不同,一般是:

function():array  {}        代表返回数组

17、 go程序中的 <- 是什么意思,在观摩go代码的时候,经常会看到这个操作符号?

答:
	goroutine是golang中在语言级别实现的轻量级线程,仅仅利用 go 就能立刻起一个新线程。多线程会引入线程之间的同步问题,在golang中可以使用channel作为同步的工具。通过channel可以实现两个goroutine之间的通信。
创建一个channel, make(chan TYPE {, NUM}) , TYPE指的是channel中传输的数据类型,第二个参数是可选的,指的是channel的容量大小。
向channel传入数据, CHAN <- DATA , CHAN 指的是目的channel即收集数据的一方, DATA 则是要传的数据。
从channel读取数据, DATA := <-CHAN ,和向channel传入数据相反,在数据输送箭头的右侧的是channel,形象地展现了数据从‘隧道’流出到变量里。

<-是对chan类型来说的。chan类型类似于一个数组。
当<- chan 的时候是对chan中的数据读取;
相反 chan <- value 是对chan赋值

18、 关于形参和实参的区别 :

https://blog.csdn.net/qq_33187168/article/details/50346465

19、 go程序中的打印,如果直接使用fmt.Printf()的话,就会把打印内容输出到后台,无法直接在浏览器观看,所以要实现类似于php中的echo 的是:

使用fmt.Fprint(this.Ctx.ResponseWriter, name)进行输出时,只输出变量,即便是设置了模板,模板也不会显示的。(这个有待测试,因为貌似需要用到beego,

	需要进行http请求,然后获取响应。我这边只是初级入门,自己在本地编译一些简单的程序,无法测试)

如果是要实现类似于php中的exit,断点打印的话,使用go的一个os包: os.Exit(0)     (PS:这个可以直接使用的)

      以上就是博主在学习go语言的时候,顺手记下来的一些东西,整体来讲差别没想象中的那么大,万变不离其宗吧,先掌握语法再说。

推荐入门笔记:
《go语言实战笔记系列》

end

猜你喜欢

转载自blog.csdn.net/LJFPHP/article/details/88560718