我刚开始从PHP过渡到GO时,无论从语法上还是编程思想上都觉得好别扭,PHP是面向工具的编程思想,而GO更像是面向包的设计思想,以是刚写GO时会常常以PHP编程思维去写代码逻辑,考虑继续考虑多态,其它的下次讲解,本日我举例了几项常见的PHP与GO语法上差异,有兴趣的朋友可以理解一下。
一、变量定义与赋值
这里可以明显突出脚本措辞与编译措辞的语法差异
PHP:弱类型变量,同一个变量可以随意赋值任何数据类型
$data = 39;jack';$data = 15;$data = ['name'=>'jack','age'=>15];
GO:强类型变量,变量需预定义,不能随意赋值不同数据类型
var data string = 34;jack"//预定义变量类型并赋值data = "ben"data = 15//报错:预定义字符串类型,不能再赋值为整型
二、函数定义与回传
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 := range arr1{ 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()}
总结:语法上各有各的上风,下次从性能上给大家讲解一下差异。
#程序员##PHP##Go措辞#