导出型词汇与校对型词汇无论从操控性上,却是从句法上有著非常大的差别。
我刚开始从PHP过渡到GO时,不论从句法上却是程式结构设计价值观上都觉得好不耐烦,PHP是程序语言的程式结构设计价值观,而GO更像面向全国包的结构设计价值观,因此刚写GO时能时常以PHP程式结构设计观念去写标识符方法论,考量承继考量隐式,其他的到时候传授,那时我总括了两项常用的PHP与GO句法上差别,有兴趣的好友能介绍呵呵。
一、表达式表述与表达式
这儿能显著注重脚本词汇与校对词汇的句法差别
PHP:弱类别表达式,同一表达式能随便表达式任何人正则表达式
$data = jack; $data = 15; $data = [name=>jack,age=>15];GO:强类别变量,表达式需原订义,无法随便表达式相同正则表达式
var data string = “jack”//原订义表达式类别并表达式 data = “ben” data = 15 //收起:原订义数组类别,无法再表达式为auth二、表达式表述与截取
Go介值截取较为方便快捷,PHP有向截取这类情形还需推论原素isset($data[nickname])
PHP:表达式只允许单个值截取
function getUser(){ return [ nickname=>Jack, city => beijing, age => 15, ]; } $data = getUser(); echo $data[nickname],$data[city],$data[age];GO:表达式可截取多个值,且传参与回参需表述正则表达式
func main() { nickname,city,_ := getUser()// ’_‘ 选择忽略 忽略fmt.Println(nickname,city) }func getUser() (nickname string,city string,age int) { return “jack”,“beijing”,15 }三、阵列(数组)
PHP对数组处理更方便快捷更强大,GO表述多维数组需考量类别,显得有点繁琐
PHP:表述一个数组表达式,无需考量原素类别任意的多层嵌入表达式
$arr1 = [1,2,3,4,5]; $arr2 = [a,b,c,d]; $arr3 = [ year => 2022, month => 03, day => 16, ]; $arr4 = [ jack => [ city => 广州, age => 23 ], ben => [ city => 深圳, age => 26 ], ];GO:需区分数组(定长)、切片、映射、接口
//数组方式:必须表述长度 arr1 := [5]int{1,2,3,4,5} //切片方式:无需表述长度,自由扩展 arr2 := []string{“a”,“b”,“c”,“d”} //映射方式:键与值匹配表达式 arr3 := map[string]string{ “year”:“2022”, “month”:“03”, “day”:“16”, } //任意类别方式:好长 arr4 := map[string]interface{}{ “jack”:map[string]interface{}{ “city”:“23”, “age”:25, }, “ben”:map[string]interface{}{ “city”:“深圳”, “age”:25, }, }四、抛出异常机制
GO设计初衷就不建议用try catch这种方式捕捉异常,在校对前就应该检查错误,很多人吐槽过这点。
PHP:try和catch能友好的捕捉标识符不规范的异常错误处理
try { if (1 == 1){ throw new \Exception(“抛出异常”); } }catch (\Exception $e){ echo “捕捉异常:”.$e->getMessage(); }GO:与其他词汇相同,panic如果不用recover()会使整个主程序退出不可用
defer func() { if r := recover(); r != nil { fmt.Println(“捕捉异常”,r.(string)) } }()if 1 == 1 { panic(“抛出异常”) }五、推论原素是否存在
PHP较为精简,内置表达式推论,GO推论显得有点不太人性化
PHP:简单用in_array与isset即可
$arr1 = [a,b,c]; if (in_array(a,$arr1)){ echo “存在”; } $arr2 = [name=>jack,city=>深圳]; if (isset($arr2[name])){ echo “存在”; }GO:切片类别必须用遍历推论,Map映射需截取值推论
arr1 := []string{“a”,“b”,“c”} for _,val := rangearr1{if val == “a” { fmt.Println(“存在”) break } } arr2 := map[string]string{ “name”:“jack”, “city”:“深圳”, } if _,ok:= arr2[“name”];ok == true { fmt.Println(“存在”) }六、承继
GO结构设计价值观就不是程序语言的程式结构设计,因此没有太多承继与隐式,编写价值观上需要改变。
PHP:extends关键词承继父类的方法和属性
class person{ protected $action = “”; protected function run(){ return “I can run”.$this->action; } } class man extends person{ public function index(){ $this->action = “swimming”; return $this->run(); } }GO:struct结构体表述成员属性表达式,从而实现承继
type Person struct { Action string}func (p *Person) Run() string{ return “I can run and “ + p.Action } type Man struct { Person } func (m *Man) Index() { m.Action = “swimming” m.Run() }总结:句法上各有各的优势,到时候从操控性上给大家传授呵呵差别。
