使用go的开始
要是问我,golang有多熟悉的话,至少在目前,写下这篇文章的时候,仅仅是门槛的水平。
目前使用golang的原因,仅仅是想作为一门语言了解以下,我看到了golang可以打包exe,想了解以下,如果不用c wpf#的情况下,用golang开发一个pc的软件出来是不是也可以。然后百度了一下,又翻到了Flutter,应该是一个跨平台的开发ui,使用的是dart语言,一款es6 + java合并的语言,也是Google公司推出的,不过不在本次讨论的范围内。
为什么不用 electron、PyQt5 开发呢?
使用 electron
其实不是没尝试过用electron【以下简称 e6n】,毕竟js我还是比较了解的,假如上手的话应该比较快。但是我的电脑一直卡在node install,直到最近再次百度,说需要设置一个electron_mirror代理到淘宝上 npm config set electron_mirror http://npm.taobao.org/mirrors/electron/
才下载下来。上网也搜集了好一些e6n的资料,但是很多人都说它吃内存大户,性能差,不过这也不能否定,本身来说,js不算一门高效的语言,我觉得e6n开发就和app的混合开发ionic一样,html编写页面,然后用一些sdk去做原生的交互,当原生提供不了的时候,还需要自己再写一些基础交互。【很多跨平台的开发应该都是如此吧】,但是不可否认的是,如果不需要大量的特效的前提下,其实也够用。使用e6n开发的代表作应该就是 visual studio code
了,看到有说迅雷x也是用它做的ui。
python开发桌面应用
python的话,原生的使用开发过一个简单的测试工具,但是排版布局更新,对于一个习惯js的我来说,实在不见得多么高效,即便是py号称简洁的语言,对于专业做排版的html来说,差了不是一点半点。至于python的学习也是因为有一些算法上的交互,学习了python。在写python代码的时候,满脑子都是对齐格式化,前期受了不少苦。还要去掉各种花括号。学了一下Django,写了一个算法服务,然后后面又把它用flask改造了一下。整体来说,代码量上面和node差别不大。不过flask的装饰器,和java一样好用。所以我还是习惯这种偏注解的api编程风格。python需要习惯 this
变成 self
java开发pc
额,这个在刚开始接触java的时候的确做过,和pyqt差不多吧。ui调试太难了,原生的ui难看, 虽然做出来的小有成就,但是本身意义不大
#C + wpf
自认为学习过java,使用对标语言c#应该没什么难度,事实上我还是高估了自己,所有的语言还是要系统性的学习一下,即便看懂了,也不会写。就是一看都会一做全错的局面。用vs的时候,如何生成一个exe还百度了很久。
前言:重点不在pc软件开发,而是基础学习
虽然前面说了很多,关于开发这个的如何如何,但是本章的重点其实还是介绍基础用法和以下经常使用的语言的对比
JavaScript | TypeScript | Java | Python | Go |
---|
为什么用这些呢,因为从风格和函数上,他们都会有一些相类似的点,大概他们的关系是这样的关系吧
先说一下如何定义个变量吧,不管哪种编程是离不开变量的。
JavaScript | TypeScript | Java | Python | Go |
---|---|---|---|---|
var 变量名 | 可以用js的方式,也可以用 var 变量名: 变量类型 | 变量类型 变量名; 分号结尾不能丢 | 直接定义一个变量 | var 变量名 变量类型 |
var a | var a:number | int a; | a | var a int |
从形式上看,ts和go的形式最接近,而py最简单。 go和java需要指定数据类型
数据类型的对比
基础类型
1. boolean
布尔类型是最常见的基础类型,用来判断对错, 在js中,布尔值有 true 和 false两种,而在python中布尔值为 True 和 False
JavaScript | TypeScript | Java | Python | Go |
---|---|---|---|---|
var a = false | var a:boolean = false | boolean a = false; | a = False | var b bool = false |
b := false |
》go中使用 :=
可以在赋值的同时指定变量类型,这一点ts也可以
var a = 1
a = "1" // 不能将类型“string”分配给类型“number”。ts(2322)
2. number
数值类型用于数学运算, go中的数值类型常用的为 int
float32
float64
,对应java的 int
float
double
,而js和py使用的就是双精度浮点型,所以ts中只有一个 number
类型
JavaScript | TypeScript | Java | Python | Go |
---|---|---|---|---|
var a = 1 | var a:number = 1 | int a = 1; | a = 1 | var a int = 1 |
a := 1.1 |
go和java的数据类型对比
Java | Go |
---|---|
byte | byte |
short | int8 |
int | int |
long | int64 |
float | float32 |
double | float64 |
boolean | bool |
char | rune |
go里面没有char类型,但是有一个类似的rune
类型 在官方的解释里,rune在golang中是int32的别名,在各个方面都与int32相同,被用来区分字符值和整数值
s:="hello你好"
// len是计算数据长度的一个函数,在py中也是len(),相当于js的length属性,java的length()方法
len(s) // 长度为 11
len([]rune(s))// 长度为 7
3. string
字符串也是一种常见的数据类型,但是在java中,String不属于基础类型,它的基础数据类型为char
JavaScript | TypeScript | Java | Python | Go |
---|---|---|---|---|
var a = "str" | var a:string = "str" | String a = "str"; | a = "str" | var a string = "str" |
var a = 'str' | - | a := "str" | ||
var a = `str` | a := `str` |
js/ts/py中,可以使用""
、''
构建字符串,并且效果是相同的,而java中 ""
表示字符串、''
表示字符,而go使用""
表示字符串
js/ts/go也可以可以使用 ` `
反引号构建字符串,但是这种方式下go不支持转义字符
Java的String、C++的std::string以及Python3的str类型都只是定宽字符序列,Go语言的字符串是一个用UTF-8编码的变宽字符序列,它的每一个字符都用一个或多个字节表示。
一个字符串是一个不可改变的字节序列,字符串可以包含任意的数据,但是通常是用来包含可读的文本,字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码表上的字符时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。
即:一个Go语言字符串是一个任意字节的常量序列。
其实我觉得,上面最重要的一句话就是括号里的,当字符为ASCII码表上的字符时,占用1字节,其余字符根据需要占用2-4字节,而java字符始终占用2字节,所以go的字符串的长度是不确定的。这样做的好处说是可以节省内存和硬盘,也不需要整体对utf8进行解码,速度上会快。实际状况我也不清楚
String A = "111aaa啊啊啊"
A.length() // 9
A := "111aaa啊啊啊"
len(A) // 15
len([]rune(A)) // 9
注释
注释的作用是为了将一些不需要运行的内容忽略掉,通常我们在编写代码中,会书写大量的代码注释,这些注释的作用是为了描述说明代码的作用
1. 行内注释
行内注释一般描述当前代码块的行为,在逻辑比较复杂的情况下会非常有用,并且我们建议编写大量的代码注释,而精简代码的书写,
TypeScript | Java | Python | Go |
---|---|---|---|
// | // | # | // |
var a = 1 // 这是js 的注释
int a = 1 // 这是java 的注释
a = 1 # 这是py的注释
a := 1 // 这是go的注释
可以看到,除了python之外,行内注释都是相同的
2. 跨行注释
跨行注释的作用通常用来注释大片的代码,在代码调试的时候使用,但是跨行注释不支持嵌套,这点是需要注意的。通常,在函数外使用跨行注释描述本函数的主要行为和入参出参的情况。
TypeScript | Java | Python | Go |
---|---|---|---|
/**/ | /**/ | ''' ''' | /**/ |
- | - | """ """ | - |
/* 这是js 的注释 */
var a = 1
/* 这是java 的注释 */
int a = 1
''' 这是py 的注释 '''
a = 1
/* 这是go 的注释 */
a := 1
python可以使用单引号和双引号作为注释,本质上是相同的
文件结构
1. 后缀
JypeScript | TypeScript | Java | Python | Go |
---|---|---|---|---|
.js | .ts | .java | .py | .go |
2. 编码文件的初始化差异
2.1 JavaScript、TavaScript
// js文件内初始化可以不需要任何代码,因为文件本身就是可执行的
2.2 Java
package main; // 表示当前文件所处的包位置,如果这个文件是文件夹的根目录下,package是main
public class ClassName { // ClassName对应的是文件名称 ClassName.java
public static void main(String args[]) {
// java的入口,其他方法名称的不可以
}
}
2.3 python
# py文件内初始化可以不需要任何代码,因为文件本身就是可执行的 demo.py
# py的运行分两种,
# 如果直接运行,会按照从上到下的顺序执行,如果是main运行【python demo.py 的形式】,还会继续从这里向下执行
# 如果是调用,则这里的代码不会被触发
# 这也算文件的入口吧
if __name__ == 'main':
pass
2.4 go
package main // 表示当前文件所处的包位置,如果这个文件是文件夹的根目录下,package是main
func main() { //默认的入口文件,其他的不可以
}