人们都在说Go=C+Python,有必要先学个入门再说对不对

简介: 人们都在说Go=C+Python,有必要先学个入门再说对不对

Go语言开发工具LiteIDE的安装


下载


下载网址: https://www.cr173.com/soft/44819.html 

网上多数讲的下载地址,已失链: http://golangtc.com/download/liteide

下载成功得到一个压缩包: liteidex37.4.qt4.8.5.zip




安装


压缩包中有两个文件夹: liteide、liteide_win64

根据你安装的Go版本是32位还64位选择对应的文件夹释放到Go安装文件夹下,我的安装在文件夹: d:\go。



运行

然后在D:\Go\liteide\bin里找到 liteide.exe,双击运行。右键点击在任务栏里的“八卦”图标,把它锁定在任务里,或者创建一个桌面快捷方式也可以。



界面

我安装的是X37.4版本:

ae91943e29924724bbf67667dd24ac08.png


LiteIDE的使用

文件菜单中“新建”,或者快捷键Ctrl+N新建一个代码,复制以下代码段框中的几行代码,另存为一个源文件helloworld.go。




hello world

万能的hello world,不管学什么语言总要遇到它

1. package main
2. 
3. import "fmt"
4. 
5. func main() {
6.     fmt.Println("hello world")
7. }





解读


1. package main

每个Go源代码文件的开头都是一个package声明,表示该Go代码所属的包。

包是Go语言里最基本的分发单位,也是工程管理中依赖关系的体现。

要生成Go可执行程序,必须建立一个名字为main的包。


2. import "fmt"

在包声明之后是import语句,用于导入该程序所依赖的包。

和python一样用import导入,但库名要用引号包括;类似C/C++的include语句。


3. func main()

包main中必须包含一个名为main()的函数(Go可执行程序的执行起点)。

Go语言的main()函数不能带参数,也不能定义返回值。

命令行传入的参数在os.Args变量中保存,如果需要支持命令行开关,可使用flag包。


4. fmt.Println("hello world")

Println()函数,需要导入该函数所属的fmt包。




执行


编译菜单中FileRun,或者使用快捷键 Alt+F6或Alt+Shift+R。

由fmt.Println()输出: hello world。

6416b9d80d4c4b4d99900b1b017cd185.png





Go语法基础入门


输出 Print

三种基本形式:带换行、不带换行、使用格式符

1. fmt.Println("string")
2. fmt.Print("string")
3. fmt.Printf("Name: %s, Age: %d\n", "Hann", 48)


与python对比:内置函数不用导入包

print('string')
print('string', end='') 
print('Name: %s, Age: %d'%('Hann',48))
#python 另有两种方法:
print('Name: {}, Age: {}'.format('Hann', 48))
name,age = 'Hann',48
print(f'Name: {name}, Age: {age}')



注释

与C/C++相同,使用 // 或 /*  */

1. // 单行注释
2. 
3. /* 
4.   多行注释
5. */


Python 则使用井号 # 或者三连引号 """ ... """ 、 ''' ... '''




标识符、关键字


标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母(A~Z和a~z)数字(0~9)、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。


这些规则,基本上所有语言都是如此。

Go 语言有 25 个关键字(或称为保留字):

image.png


Go 语言有 36 个预定义标识符

image.png


Python 只有30来个关键字,上表的标识符也有类似的但没有这么多类型标识符。

程序一般由关键字、常量、变量、运算符、类型和函数组成。





数据类型


布尔型


布尔型的值只可以是常量 true 或者 false,字母全部小写,其格式化符:%t。

Go和Python都是大小写敏感的编程语言,Python使用的布尔值首字母要大写。




数字型


#有符号整数
int8(-128 -> 127)
int16(-32768 -> 32767)
int32(-2,147,483,648 -> 2,147,483,647)
int64(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807)
#无符号整数
uint8(0 -> 255)
uint16(0 -> 65,535)
uint32(0 -> 4,294,967,295)
uint64(0 -> 18,446,744,073,709,551,615)
#浮点型
float32(IEEE-754 32位浮点型数)
float64(IEEE-754 64位浮点型数)
#无float类型
#复数,格式化符:%v
Go 拥有以下复数类型:
complex64 (32 位实数和虚数)
complex128 (64 位实数和虚数)
复数与python基本相同,只是两者的虚数单位不同,Go用的是 i ,python用的是 j 。
Go语言的数字类型比较接近C/C++,不如Python只有int, float, complex来的方便。




变量声明

Go语言引入关键字var,而类型信息放在变量名之后,示例如下:

var v1 int
var v2 string
var v3 [10]int // 数组
var v4 []int // 数组切片
var c1 complex64 = 3 + 23i
fmt.Printf("The value is: %v", c1)  // 输出: 3 + 23i
//函数内部可以隐式声明变量,使用 := ,不需要var 和 类型
InternalVariable := 6


这一点比Python严格,Python直接赋值即声明,没有声明关键字,且不强制要指定类型。


   1)整型的零值为 0,浮点型的零值为 0.0。


   2)int 和 uint 在 32 位操作系统上均使用4字节,在 64 位操作系统上均使用8字节。


   3)uintptr 的长度被设定为足够存放一个指针即可。


   4)整型的零值为 0,浮点型的零值为 0.0。


   5)int 型是计算最快的一种类型。


   6)尽可能地使用 float64,因为 math 包中所有有关数学运算的函数都会要求接收这个类型。


   7)Go 是强类型语言,不会进行隐式转换.。所以Go 中不允许不同类型之间的混合使用,但允许常量之间的混合使用。




字符型


字符不是 Go 语言的一个类型,字符只是整数的特殊用例:

1)byte 类型是 uint8的别名:

1. var ch byte = 'A' 
2. var ch byte = 65
3. var ch byte = '\x41'  // \x 总是紧跟着长度为 2 的 16 进制数
4. /* 以上三行代码等价 */


2) rune 是 int32 的别名。

Unicode 至少占用 2 个字节,所以Go使用 int16 或者 int 类型来表示。如果需要使用到 4 字节,则会加上 \U 前缀;前缀 \u 则总是紧跟着长度为 4 的 16 进制数,前缀 \U紧跟着长度为 8 的 16 进制数。

var ch int = '\u0041'
var ch2 int = '\u03B2'
var ch3 int = '\U00101234'
fmt.Printf("%d - %d - %d\n", ch, ch2, ch3) // integer
fmt.Printf("%c - %c - %c\n", ch, ch2, ch3) // character
fmt.Printf("%X - %X - %X\n", ch, ch2, ch3) // UTF-8 bytes
fmt.Printf("%U - %U - %U", ch, ch2, ch3) // UTF-8 code point

对Python来说也没字符类型一说,它可以看作长度为1的字符串。



字符串类型


字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。


   1)字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)


   2)字符串在Go语言内存模型中用一个2字长的数据结构表示。它包含一个指向字符串存储数据的指针和一个长度数据。




派生类型


   (a) 指针类型(Pointer)

   (b) 数组类型

   (c) 结构类型 (struct)

   (d) Channel 类型

   (e) 函数类型

   (f) 切片类型

   (g) 接口类型(interface)

   (h) Map 类型  


这些类型大多是python所没有的,可以找到数组、结构、函数、切片、Map等相近的用法。



零值 nil


Go任何类型在未初始化时都对应一个零值:布尔类型是false,整型是0,字符串是"",而指针,函数,interface,slice,channel和map的零值都是nil。


可以把 nil 看作相当于Python的None。




常量

常量是一个简单值的标识符,在程序运行时,不会被修改的量。


常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。

常量的定义格式: const identifier [type] = value

可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。

显式类型定义: const b string = "abc"

隐式类型定义: const b = "abc"

Python没有常量关键字const的,就是不能被重定义的或值不变的“变量”。




运算符

运算符用于在程序运行时执行数学或逻辑运算。Go 语言内置的运算符有:




算术运算符

+、-、*、/ 、% 加减乘除、取余


++、-- 有和C/C++一样的自增减运算,但只有后增后减,没先自增先自减;

即只有 i++, j--;没有++i, --j;且不能有自增后赋值: a=i++,这是不允许的。

也没有Python的整除//,和C/C++一样用数据类型来分辨这“两种”运算。

package main
import "fmt"
func main() {
  fmt.Printf("%d", 5/2)
  fmt.Println()
  fmt.Printf("%f", 5/2.0)
}
/*
2
2.500000
*/


关系运算符

==、!=、>、<、>=、<=  这些和Python的都相同。


逻辑运算符

&&、||、!  对应Python的 and、 or、 not 运算。



位运算符

&、|、^ 、<<、>> 和Python相同:“与、或、异或”及左、右位移。


按位取反运算: Go直接用^符号,Python则用~符号。

即: Go语言中,^ 作一元运算符时即按位取反,作二元运算符时即按位异或。

Go语言还特有一个“与非”运算: &^,相当于与运算和非运算的“连写”。


赋值运算符

=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|= 差不多的,略。



其他运算符

*a    指针变量a

&a    返回变量a的存储地址

这两个运算和C/C++中的用法相同,Python是没有指针的。




控制语句


条件语句

if 语句:

package main
import "fmt"
func main() {
  var a int = 3
  if a < 23 {
    fmt.Printf("a 小于 23\n")
  }
  fmt.Printf("a 的值为 : %d\n", a)
}


if-else语句:

1. if 布尔表达式 {
2. /* 在布尔表达式为 true 时执行 */
3. } else {  
4. /* 在布尔表达式为 false 时执行 */
5. }



if- else if-else语句:

package main
import "fmt"
func main() {
    var age int = 23
    if age == 25 {
        fmt.Println("true")
    } else if age < 25 {
        fmt.Println("too small")
    } else {
        fmt.Println("too big")
    }
}


Go的条件语句中else 位置不能新起一行,必须紧跟在右括号后面。

与Python对比,else要另起一行,且Python有关键字elif:


a = 3
if a<23:
        ......
if a<23:
        ......
else:
        ......
if a<5:
        ......
elif a<10:
        ......
else:
        ......

注意:Go没有三目操作符a=b>c?b:c,Python中即 a=b if b>c else c。



开关语句(选择、分支)

switch-case-default语句:

switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}


package main
import "fmt"
func main() {
  var grade string = ""
  var marks int = 65
  switch marks / 10 {
  case 9, 10:
    grade = "A"
  case 8:
    grade = "B"
  case 6, 7:
    grade = "C"
  default:
    grade = "D"
  }
  fmt.Printf("你的等级是 %s\n", grade)
}


Python最新版本3.10.0才开始启用 match - case 开关语句,之前的版本只能使用 if... elif... elif... elif... else... 代替。

相对于C/C++分支结构中,Go语言不支持如下像C/C++一样的写法:

package main
import "fmt"
func main() {
  var grade string = "未定义"
  var marks int = 65
  switch marks / 10 {
  case 9:
  case 10:
    grade = "A"
  case 8:
    grade = "B"
  case 6:
  case 7:
    grade = "C"
  default:
    grade = "D"
  }
  fmt.Printf("你的等级是 %s\n", grade)
}
/* Out:
你的等级是 未定义
*/


fallthrough

使用fallthrough就可以解决程序要依次执行多个case代码的问题。

package main
import "fmt"
func main() {
  var grade string = "未定义"
  var marks int = 92
  switch marks / 10 {
  case 9:
    fallthrough
  case 10:
    grade = "A"
  case 8:
    grade = "B"
  case 6:
    fallthrough
  case 7:
    grade = "C"
  default:
    grade = "D"
  }
  fmt.Printf("你的等级是 %s\n", grade)
}

另外Go还有一种开关结构语句,因为要用到新类型channel,保留暂时先不讨论:

select-case-default语句

select {
    case clause1:
        statement(s1)
    case clsuse2:
        statement(s2)
    default:
        statement(s3)
}



循环语句

Go 只有for循环语句,没有while语句。但比Python有更多种形态:


和 C 语言的 for 一样:

for init; condition; post { }

和 C 的 while 一样:

for condition { }

和 C 的 for(;;) 一样:

for { }

和 Python 的 for i in range(n)差不多:

这种格式可以对字符串、数组、切片等进行迭代输出元素。

for key, value := range oldMap {

   newMap[key] = value

}



循环实例

实例1:累加1+2+3+...+100

package main
import "fmt"
func main() {
  sum := 0
  for i := 0; i <= 100; i++ {
    sum += i
  }
  fmt.Println(sum)
    // 以下写法就和 While 形式一样,只是关键字没换而已
  sum = 0
  i := 1
  for i <= 100 {
    sum += i
    i++
  }
  fmt.Println(sum)
}




实例2:100以内的素数

package main
import "fmt"
func main() {
  // var prime,c int   //定义变量不使用也会报错
  var prime int
  var flag bool
  prime = 1
  //while(prime<100) {  //Go语言没有while
  for prime < 100 { //这种形式就似while语句,没用这个关键字而已
    prime++
    flag = true
    for tmp := 2; tmp < prime; tmp++ {
      if prime%tmp == 0 {
        flag = false
      }
    }
    if flag == true {
      fmt.Println(prime, "是素数")
    }
  }
}
/*
2 是素数
3 是素数
5 是素数
7 是素数
11 是素数
13 是素数
17 是素数
19 是素数
23 是素数
29 是素数
31 是素数
37 是素数
41 是素数
43 是素数
47 是素数
53 是素数
59 是素数
61 是素数
67 是素数
71 是素数
73 是素数
79 是素数
83 是素数
89 是素数
97 是素数
*/



continue语句

continue 忽略当前循环体内的剩下代码,提前进入下一轮循环。

用法与Python及其它语言的完全相同,略。



break 语句

break 可以提前退出当前循环,用法与Python及其它语言的基本相同;

但是Go语言中用个跳转到指定标签的功能,可以同时跳出多层循环。

注:标签一定要放在循环之前,如下示例:

package main
import "fmt"
func main() {
  count := 1
Label1:
  for {
    count++
    for {
      break Label1
      count++
    }
  }
  fmt.Println(count) // Out: 2
}





goto 语句


goto 可以无条件地转移到过程中指定的行(指定标签所在行之后)

注:大多数程序员都不待见这个goto语句,结构化程序设计中一般不主张使用goto语句。


比如,从主程序跳入子程序是绝对禁止的,或者从循环、结构等外部直接跳转到其内部。


Python 语言中没用goto语句,省得有了乱来瞎用。



目录
相关文章
|
2天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
20 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
1天前
|
存储 设计模式 安全
Go语言中的并发编程:从入门到精通###
本文深入探讨了Go语言中并发编程的核心概念与实践技巧,旨在帮助读者从理论到实战全面掌握Go的并发机制。不同于传统的技术文章摘要,本部分将通过一系列生动的案例和代码示例,直观展示Go语言如何优雅地处理并发任务,提升程序性能与响应速度。无论你是Go语言初学者还是有一定经验的开发者,都能在本文中找到实用的知识与灵感。 ###
|
3天前
|
Python
探索Python装饰器:从入门到实践
【10月更文挑战第32天】在编程世界中,装饰器是一种特殊的函数,它允许我们在不改变原有函数代码的情况下,增加额外的功能。本文将通过简单易懂的语言和实际案例,带你了解Python中装饰器的基础知识、应用以及如何自定义装饰器,让你的代码更加灵活和强大。
11 2
|
4天前
|
监控 Python
探索Python中的装饰器:从入门到实践
【10月更文挑战第31天】在Python的世界里,装饰器是那些隐藏在幕后的魔法师,它们拥有着改变函数行为的能力。本文将带你走进装饰器的世界,从基础概念到实际应用,一步步揭开它的神秘面纱。你将学会如何用几行代码增强你的函数功能,以及如何避免常见的陷阱。让我们一起来发现装饰器的魔力吧!
|
6天前
|
Serverless Go
Go语言中的并发编程:从入门到精通
本文将深入探讨Go语言中并发编程的核心概念和实践,包括goroutine、channel以及sync包等。通过实例演示如何利用这些工具实现高效的并发处理,同时避免常见的陷阱和错误。
|
11天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第24天】本文将带你进入Python的世界,从最基础的语法开始,逐步深入到实际的项目应用。我们将一起探索Python的强大功能和灵活性,无论你是编程新手还是有经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python的奇妙之旅吧!
|
13天前
|
数据采集 存储 数据库
Python中实现简单爬虫的入门指南
【10月更文挑战第22天】本文将带你进入Python爬虫的世界,从基础概念到实战操作,一步步指导你如何使用Python编写一个简单的网络爬虫。我们将不展示代码示例,而是通过详细的步骤描述和逻辑讲解,帮助你理解爬虫的工作原理和开发过程。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你打开一扇通往数据收集新世界的大门。
|
11天前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
【10月更文挑战第24天】 在Python的世界里,装饰器是一个既神秘又强大的工具。它们就像是程序的“隐形斗篷”,能在不改变原有代码结构的情况下,增加新的功能。本篇文章将带你走进装饰器的世界,从基础概念出发,通过实际例子,逐步深入到装饰器的高级应用,让你的代码更加优雅和高效。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往高效编程的大门。
|
12天前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
机器学习基础:使用Python和Scikit-learn入门
23 1
|
3天前
|
存储 机器学习/深度学习 搜索推荐
Python编程入门:从零开始构建你的第一个程序
【10月更文挑战第32天】本文旨在通过浅显易懂的方式引导编程新手进入Python的世界。我们将一起探索Python的基础语法,并通过实例学习如何构建一个简单的程序。文章将不直接展示代码,而是鼓励读者在阅读过程中自行尝试编写,以加深理解和记忆。无论你是编程初学者还是希望巩固基础知识的开发者,这篇文章都将是你的良师益友。让我们开始吧!