一、前言

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

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

二、正文

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"这里的"<

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

13、 关于go的fmt包格式化字符串的格式参数:https://blog..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..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程序中的

答:

goroutine是golang中在语言级别实现的轻量级线程,仅仅利用 go 就能立刻起一个新线程。多线程会引入线程之间的同步问题,在golang中可以使用channel作为同步的工具。通过channel可以实现两个goroutine之间的通信。

创建一个channel, make(chan TYPE {, NUM}) , TYPE指的是channel中传输的数据类型,第二个参数是可选的,指的是channel的容量大小。

向channel传入数据, CHAN

从channel读取数据, DATA :=

相反 chan

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

https://blog..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