静态语言
静态类型语言:与动态类型语言刚好相反,它的数据类型检查发生在在编译阶段,也就是说在写程序时要声明变量的数据类型。C/C++、C#、Java都是静态类型语言的典型代表。
动态语言
动态类型语言:是指在运行期间才去做数据类型检查的语言。在用动态语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言
强类型语言
强类型语言:使之强制数据类型定义的语言。没有强制类型转化前,不允许两种不同类型的变量相互操作。强类型定义语言是类型安全的语言,如Java、C# 和 Python,比如Java中“int i = 0.0;”是无法通过编译的
弱类型语言
弱类型语言:数据类型可以被忽略的语言。与强类型语言相反, 一个变量可以赋不同数据类型的值,允许将一块内存看做多种类型,比如直接将整型变量与字符变量相加。C++、PHP都是弱类型语言,比如C++中“int i = 0.0;”是可以编译运行的;
跨平台编译型语言
可以跨平台编译,可以在windows系统下编译Linux系统运行的程序,也就是在这个平台可以编译另一个平台的可执行文件。
go就可以跨平台编译,python则需要安装python解释器而且不同平台安装python解释器的方式还是不一样的,java需要安装java虚拟机(jdk)不同平台安装方式也是不同的,c/c++需要在不同平台上现场编译,这样go的优势就凸显出来了。使用go可以在自己的电脑上写好直接编译成服务器可以执行的文件拿过去运行就可以了,省去了搭建环境的繁琐步骤。
go的特点:垃圾回收机制、支持面向对象和面向过程(go不是一门纯粹的面向对象语言,没有类的概念,但可以实现面向对象的特性:继承、封装、多态)
go的源码是由c写起来的,1.5以后是自己写自己,这一点和python是类似的python源码期初也是用c/c++写的,后来就自己写自己。
目前go的使用:各大互联网公司的运维、后端都有使用go,比较流行的k8s(容器编排)使用go写的,由于区块链的第一个开源项目使用go写的,所以在做区块链时用go的也比较多。
目前go的劣势是语言新,模块少。
go语言的前景
go出现的比较晚,具备其他语言所不具有的先天优势:更加适合现代处理器的多核运行,编程上也综合了前面编程语言的优势,有人说go将会称霸编程语言的下一个十年。
开发环境的安装
一、安装开发环境
二、IDE的安装
go的数据类型
说明:go和python不同,go的代码和缩进没有关系。
数字
int
int:默认是计算机的执行位数,如32位计算机则是int32,
int8:存储长度是8个比特位,第一位表示正负号,后七位表示内容可表示正2^7-1,下面同理
int16
int32
int64
uint:正整数
uint8:八个bit都表示内容,也就是可以表示[0,2^8-1),所以unit8别名byte(字节)
uint16
uint32:别名rune,4个字节,表示一个字符
uint64
float
float32
float64
complex(复数)
complex32
complex64
字符串
string:双引号引起来的是字符串,注意这里必须是双引号,单引号三引号都不行,单引号会将引在里面的字符的对应的ASCII码编号打印出来。反引号是支持换行的字符串。
布尔
这里的bool类型只有:true和false两种状态
0,1和bool没有关系
常量
这里的常量是不可变得,如果修改了会报错,不可以简略声明。通常用来定义数据库连接地址,端口号等
package main
import "fmt"
const name = "zgh"//常量的定义
const name1,age = "zgh",20//一次定义多个常量
func main(){
}
go中的注释
单行注释//
多行注释/*要注释的内容*/
go的注释方式是从C继承过来的,除了C语言JavaScript也使用这样的注释方式。
代码编写规则
package main // 必须指明是哪个包 main包
//表示导入fmt包,对比python即可
import "fmt"
func main() { //定义了一个main函数
fmt.Println(a..."hello world") //打印出helloworld
}
/*注意:
1.go的代码必须在main函数中写,go程序的入口是main包下的main函数,这点和C语言相似
2. fmt.Println("hello world") 你看到的a... 其实是goland给你提示的,函数的形参是a...,在其他IDE下是没有a...的
3.go语言中,包导入必须使用,否则报错,注释掉,包自动删除(goland做的,其他编辑器,没有)
4.go文件名不能和main函数等函数名或者包名重名,否则会报错
*/
来对比一下C语言
#include <stdio.h>
int main()
{
/* 我的第一个 C 程序 */
printf("Hello, World!
");
return 0;
}
/*
所有的 C 语言程序都需要包含 main() 函数。 代码从 main() 函数开始执行。
printf() 用于格式化输出到屏幕。printf() 函数在 "stdio.h" 头文件中声明。
stdio.h 是一个头文件 (标准输入输出头文件) , #include 是一个预处理命令,用来引入头文件。 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。
return 0; 语句用于表示退出程序
*/
go代码的执行
//执行go代码
1 goland上点击右键 Run 就可以执行(仅限于goland,vs code等其他编辑器都没有run)
2 先编译,再执行正统的用法(go是编译型语言),用命令
编译:go build s1.go 编译,编译成当前平台的可执行文件 s1.exe
执行:s1.exe
3 编译并执行(在vs code上的命令窗口下执行go文件)
go run s1.go 相当于2中的所有步骤,不产生可执行文件 s1.exe
定义变量的三种方式
package main
import "fmt"
func main(){
//fmt.Println("hello world")
//1 第一种:全定义
//var关键字 变量名 变量类型 = 变量值
var a int = 10
fmt.Println("a:",a)
//2 第二种:类型推导(自动推导出变量类型)
var b = 10
fmt.Println("b:",b)
//3 第三种:简略声明(这个用的多) 冒号跟等号是一起的
c := 10
fmt.Println("c:",c)
//4 只定义变量,不赋值
var d int
fmt.Println("d:",d)
//5 声明多个变量,三种方式都可以
//var e,f,g int = 1,2,3
//var e,f,g = 10,11,"xxx"
e,f,g := 10,11,"xxx"
fmt.Println("e:",e,"f:",f,"g:",g)
//6 变量不能重复定义
//var h int
//var h = 90//重复定义会报错
//h := 90//重复定义会报错
//h = 90//重复定义会报错
var h int
//var h,i = 10,20//重复定义会报错
h,i := 10,20//允许(特殊情况)
fmt.Println(h,i)
}
/*
总结:
1 变量定义了必须使用,否则报错(只有go要求这样)
2 查看变量没写
3 变量要先定义再使用
4 变量类型是固定的,不允许中途改变(静态语言)
5 如果只是定义变量,必须指定类型,只能用第一种定义方式
6 变量不允许重复定义
强调:
之后所有类型的变量定义都参照前三种定义变量的方式
*/
a: 10
b: 10
c: 10
d: 0
e: 1 f: 2 g: 3
e: 10 f: 11 g: xxx
e: 10 f: 11 g: xxx