详解Go与PHP的语法对比


Posted in PHP onMay 29, 2021

概述

Go 是由 Google 设计的一门静态类型的编译型语言。它有点类似于 C,但是它包含了更多的优点,比如垃圾回收、内存安全、结构类型和并发性。它的并发机制使多核和网络机器能够发挥最大的作用。这是 GoLang 的最佳卖点之一。此外,Go 速度快,表现力强,干净且高效。这也是 Go 如此吸引开发者学习的原因。

PHP 是一种动态类型语言,它使新手更容易编写代码。现在的问题是,PHP 开发人员能否从动态类型语言切换到像 Go 这样的静态类型语言?为了找到答案,让我们对比一下 Go 和 PHP 之间的语法差异。

数据类型

Go 同时支持有符号和无符号整数,而 PHP 只支持有符号整数。

另一个主要区别是数组。Go 对 array 和 map 有单独的类型,而 PHP 数组实际上是有序的 map。

Go 与 PHP 相比没有对象。但是,Go 有一个类似于object的struct类型。

PHP 数据类型:

boolean

string

integer // Signed integer, PHP does not support unsigned integers.

float (also known as "floats", "doubles", or "real numbers")

array

object

null

resource

Go 数据类型:

string

bool

int  int8  int16  int32  int64 // Signed integer

uint uint8 uint16 uint32 uint64 uintptr // Unsigned integers

byte // alias for uint8

rune // alias for int32

float32 float64

complex64 complex128

array

slices

map

struct

变量

Go 使用var声明全局变量和函数变量。但是,它也支持带有初始化程序的简写语法,但只能在函数内部使用。另一方面,PHP 仅支持带有初始化程序的变量声明。

// 变量声明

// Go               // PHP

var i int           $i = 0      // integer

var f float64       $f = 0.0    // float

var b bool          $b = false  // boolean

var s string        $s = ""     // string

var a [2]string     $a = []     // array

// 简短的变量声明

// Go                      // PHP

i := 0                     $i = 0      // integer

f := 0.0                   $f = 0.0    // float

b := false                 $b = false  // boolean

s := ""                    $s = ""     // string

a := [1]string{"hello"}    $a = []     // array

类型转换

// Go

i := 42             // Signed integer

f := float64(i)     // Float

u := uint(f)        // Unsigned integer

// PHP

$i = 1;

$f = (float) $i;    // 1.0

$b = (bool) $f      // true

$s = (string) $b    // "1"

数组

// Go

var a [2]string

a[0] = "Hello"

a[1] = "World"

// OR

a := [2]string{"hello", "world"}

// PHP

$a = [

    "hello",

    "world"

];

Maps

// Go

m := map[string]string{

    "first_name": "Foo",

    "last_name": "Bar",

}

// PHP

$m = [

    "first_name" => "Foo",

    "last_name" => "Bar"

];

对象类型

Go 不支持对象。但是,您可以使用structs实现object之类的语法。

// Go
package main
import "fmt"
type Person struct {
    Name string
    Address string
}
func main() {
    person := Person{"Foo bar", "Sydney, Australia"}
    fmt.Println(person.Name)
}
// PHP
$person = new stdClass;
$person->Name = "Foo bar";
$person->Address = "Sydney, Australia";
echo $person->Name;
// 或使用类型转换
$person = (object) [
    'Name' => "Foo bar",
    'Address' => "Sydney, Australia"
];
echo $person->Name;

函数

Go 和 PHP 函数之间的主要区别是; Go 函数可以返回任意数量的结果,而 PHP 函数只能返回一个结果。但是,PHP 可以通过返回数组来模拟相同的功能。

// Go
package main
import "fmt"
func fullname(firstName string, lastName string) (string) {
    return firstName + " " + lastName
}
func main() {
    name := fullname("Foo", "Bar")
    fmt.Println(name)
}
// 返回多个结果
// Go
package main
import "fmt"
func swap(x, y string) (string, string) {
    return y, x
}
func main() {
    a, b := swap("hello", "world")
    fmt.Println(a, b)
}
// PHP
function fullname(string $firstName, string $lastName) : string {
    return $firstName . " " . $lastName;
}
$name = fullname("Foo", "Bar");
echo $name;
// PHP
// 返回一个数组以获得多个结果
function swap(string $x, string $y): array {
    return [$y, $x];
}
[$a, $b] = swap('hello', 'world');
echo $a, $b;

控制语句

If-Else

// Go
package main
import (
    "fmt"
)
func compare(a int, b int) {
    if a > b {
        fmt.Println("a is bigger than b")
    } else {
        fmt.Println("a is NOT greater than b")
    }
}
func main() {
    compare(12, 10);
}
// PHP
function compare(int $a, int $b) {
    if ($a > $b) {
        echo "a is bigger than b";
    } else {
        echo "a is NOT greater than b";
    }
}
compare(12, 10);

Switch

根据 Golang 官方教程文档:

Go 的 switch 与 C,C+,Java,JavaScript 和 PHP 中的类似,除了 Go 只运行选中的 case,而不是随后的所有 case。 实际上,break语句在这些语言中的每个 case 后都是必需的,而在 Go 中则是自动补充的。另一个重要的区别是 Go 的 switch cases 不需要是常量,并且涉及的值也不必是整数。

// Go
package main
import (
    "fmt"
    "runtime"
)
func main() {
    fmt.Print("Go runs on ")

    os := runtime.GOOS;

    switch os {
    case "darwin":
        fmt.Println("OS X.")
    case "linux":
        fmt.Println("Linux.")
    default:
        fmt.Printf("%s.\n", os)
    }
}
// PHP
echo "PHP runs on ";

switch (PHP_OS) {
    case "darwin":
        echo "OS X.";
        break;
    case "linux":
        echo "Linux.";
        break;
    default:
        echo PHP_OS;
}

For 循环

// Go
package main
import "fmt"
func main() {
    sum := 0

    for i := 0; i < 10; i++ {
        sum += i
    }

    fmt.Println(sum)
}
// PHP
$sum = 0;

for ($i = 0; $i < 10; $i++) {
    $sum += $i;
}
echo $sum;

While 循环

Go 自身没有 while 循环的语法。相应的,Go 使用for循环代替实现 while 循环.

// Go
package main
import "fmt"
func main() {
    sum := 1

    for sum < 100 {
        sum += sum
    }

    fmt.Println(sum)
}
// PHP
$sum = 1;
while ($sum < 100) {
    $sum += $sum;
}
echo $sum;

Foreach/Range

PHP 使用foreach迭代数组和对象。与之对应,Go 使用range迭代 slice 或 map。

/ Go
package main
import "fmt"
func main() {
    colours := []string{"Maroon", "Red", "Green", "Blue"}

    for index, colour := range colours {
        fmt.Printf("index: %d, colour: %s\n", index, colour)
    }
}
// PHP
$colours = ["Maroon", "Red", "Green", "Blue"];

foreach($colours as $index => $colour) {
    echo "index: {$index}, colour: {$colour}\n";
}

以上就是详解Go与PHP的语法对比的详细内容,更多关于Go与PHP的语法对比的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
php出现Cannot modify header information问题的解决方法大全
Apr 09 PHP
PHP 八种基本的数据类型小结
Jun 01 PHP
如何用php生成扭曲及旋转的验证码图片
Jun 07 PHP
PHP中使用循环实现的金字塔图形
Nov 08 PHP
浅谈json_encode用法
Mar 05 PHP
PHP实现简单爬虫的方法
Jul 29 PHP
Yii数据读取与跳转参数传递用法实例分析
Jul 12 PHP
PHP实现支持加盐的图片加密解密
Sep 09 PHP
php实现PDO中捕获SQL语句错误的方法
Feb 16 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
PHP调用Mailgun发送邮件的方法
May 04 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
Jun 19 PHP
详解php中流行的rpc框架
如何在Mac上通过docker配置PHP开发环境
浅谈如何提高PHP代码质量之端到端集成测试
May 28 #PHP
浅谈如何提高PHP代码质量之单元测试
May 28 #PHP
浅谈如何提高PHP代码的质量
May 28 #PHP
详解thinkphp的Auth类认证
May 28 #PHP
如何理解PHP核心特性命名空间
May 28 #PHP
You might like
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
php与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
浅析php原型模式
2014/11/25 PHP
浅谈php处理后端&amp;接口访问超时的解决方法
2016/10/29 PHP
php实现微信扫码支付
2017/03/26 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
jQuery 表单验证扩展(四)
2010/10/20 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
JavaScript实现单例模式实例分享
2017/12/22 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
Python求算数平方根和约数的方法汇总
2016/03/09 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
PyCharm设置护眼背景色的方法
2018/10/29 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
Python基础教程之if判断,while循环,循环嵌套
2019/04/25 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
7 For All Mankind官网:美国加州洛杉矶的高级牛仔服装品牌
2018/12/20 全球购物
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
大一学生职业生涯规划
2014/03/11 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
结婚老公保证书
2015/02/26 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
如何开发一个渐进式Web应用程序PWA
2021/05/10 Javascript
python爬取某网站原图作为壁纸
2021/06/02 Python
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android
2022微信温控新功能上线
2022/05/09 数码科技