golang初识 和 变量,常量,iota

1|0一、go语言与python

1|11. go语言

  1. go语言语法固定,没有那么多花里胡哨的写法,语法也简单。一共25个关键字,37个保留字
  2. 本身支持高并发,数据计算,做后端天然有优势。(云计算,区块链,网络服务行业,新兴的公司基本都用go语言)
  3. go为编译型语言(先编译再执行)、强类型语言(定义之好类型后的变量是不能赋值成别的类型的值的,比如刚开始定义的string类型,不能再后面赋值为其他类型的值,而python可以随意赋值),执行速度更快,go项目在不同操作系统上就会先被编译成不同格式的执行文件,如windows上被编译成.exe 后缀的可执行文件。
  4. go项目的整个程序只有main包(也就是主包)才是执行的入口,而python每一个py文件都可以是入口,都可以直接执行
  5. goland为go开发常用的ide,类似pycharm。vscode也可以开发go

1|22. python

  1. 开发效率高,所以周期短

  2. 爬虫加数据分析

  3. 人工智能

1|33. 下载安装

1|0(1)Linux安装

1、下载二进制包:go1.13.3.linux-amd64.tar.gz

2、将下载的二进制包解压至 /usr/local目录。

tar -C /usr/local -xzf go1.13.3.linux-amd64.tar.gz

3、将 /usr/local/go/bin 目录添加至PATH环境变量:

export PATH=$PATH:/usr/local/go/bin

1|0(2)Windows安装

  • Windows 下可以使用 .msi 后缀(在下载列表中可以找到该文件,如go1.13.3.windows-amd64.msi)的安装包来安装。

  • 默认情况下 .msi 文件会安装在 c:\Go 目录下。你可以将 c:\Go\bin 目录添加到 Path 环境变量中。添加后你需要重启命令窗口才能生效

1|0(3)Mac安装

  • Mac下直接双击go1.13.3.darwin-amd64.pkg,一路下一步安装即可

1|44. go语言的基本语法

  • package 后面跟的是包名,用来声明当前这个文件是属于哪个包。如果是属于main包,main包为整个程序的入口。

  • go语言在命令行的两种运行方式

    • 先生成编译文件,再手动执行编译文件

      • go build 文件名.go —————> windows下会把该文件打包成一个.exe文件,再运行该.exe文件
    • 命令行直接执行 go run 文件名.go 命令即可(相当于对编译和执行命令的封装)

  • import 包名 用来导入的包

  • func main()是整个程序的入口,没有参数。

  • 在函数外部只能放置标识符(即 变量,常量,函数,类型)的声明

  • 变量定义之后必须使用(包级别的变量可以不使用),否则报错(python中用不用都没事)

  • 导的包也必须使用,不使用也报错(python中用不用都没事)

  • 函数外的每个语句都必须以关键字开始(var、const、func等)

  • 单行注释用 // ,多行注释用 /**/

  • 单引号、双引号、反引号的作用

    • 单引号在go语言中表示golang中的rune(int32)类型,单引号里面是单个字符,对应的值为该字符对应的ASCII值

      • func main() { a := 'A' fmt.Println(a) } /* 输出: random@random-wz MINGW64 /c/GOPATH/src/Test $ go run main.go 65 */
    • 双引号在go语言中双引号里面可以是单个字符也可以是字符串,双引号里面可以有转义字符,如\n、\r等,对应go语言中的string类型

      • func main() { a := "Hello golang\nI am random_wz." fmt.Println(a) } /* 输出: random@random-wz MINGW64 /c/GOPATH/src/Test $ go run main.go Hello golang I am random_wz. */
    • 反引号中的字符表示其原生的意思,在反引号中的内容可以是多行内容,不支持转义

      • func main() { a := `Hello golang\n: I am random_wz. Good.` fmt.Println(a) } /* 输出: random@random-wz MINGW64 /c/GOPATH/src/Test $ go run main.go Hello golang\n: I am random_wz. Good. */

1|55. 简单的go程序脚本

// 双斜杠,为单行注释 /* 多行注释 */ package main // 表示当前文件为main包,也就是主包,go的文件想要执行,必须要有个主包,整个程序的入口就是主包文件 import "fmt" // func 关键字,类似python中的def 关键字。表示定义一个函数,函数名必须叫main func main() { fmt.Println("hello world") } // 命令行两种执行方式: // 命令行编译后执行生成的编译文件即可 go build test.go --> test.exe // 命令行直接运行 .go 的文件 go run test.go (相当于对编译和执行命令的封装)

2|0二、变量相关

  • go中,变量不能重复声明,但是可以重新赋值,同一个变量名在不同作用域中可以重复声明

2|12. 标识符和关键字

  • 标识符就是python中的变量名, 由字母数字和_(下划线)组成,并且只能以字母和_开头 。

  • 关键字就是有各种特定作用的名字。如python中的if def return等等。go语言里有25个关键字,并且还有37个保留字。我们不建议用关键字或保留字当做变量名即标识符。

2|23. 变量声明

  • 类似前端JavaScript的变量声明方式

1|0(1)普通声明

1|0i. 不赋值声明

// 语法1: var 变量名 变量类型 = 变量值 // 行尾无需分号 // 例如: var name string var age int var isOk bool // 语法2:批量声明 var ( a string b int c bool d float32 ) // 语法3:批量声明 package main import "fmt" func main() { var width, height int fmt.Println("width is", width, "height is", height) width = 100 height = 50 fmt.Println("new width is", width, "new height is ", height) } // 打印结果: width is 0 height is 0 new width is 100 new height is 50
  • 已经声明的变量若未对其进行初始化,他们都会有一个默认值

    • 数字类型是0,字符串是空字符串, 布尔型变量默认为false。 切片、map、指针、接口、channel 只声明,未初始化值时都默认为nil ,某些函数返回error时,无报错时的error恒等于 nil

1|0ii. 赋值声明

// 语法: var 变量名 类型 = 变量值 // 例子: var name string = "test_name" var age int = 18 // 一次初始化多个变量: var name string, age int = "test_name", 20

1|0(2)不指定类型声明

  • 如果变量有初始值,那么 Go 能够自动推断具有初始值的变量的类型。因此,如果变量有初始值,就可以在变量声明中省略 类型

    var name = "test_name" var age = 18 // 一次初始化多个变量: var name, age = "test_name", 20

1|0(3)简短声明

  • 在函数内部,可以使用更简略的 := 方式声明并初始化变量

  • 简短声明要求 := 操作符左边的所有变量都有初始值,否则执行会报错

  • 简短声明的语法要求 := 操作符的左边至少有一个变量是尚未声明的,否则执行会报错

  • 简短声明看似可以重新定义之前定义过的变量,实际上简短声明只是对之前定义的变量进行改值

    // 语法: 变量名 := 变量值 package main import "fmt" // 全局变量m var m = 100 func main() { n := 10 m := 200 // 此处声明局部变量m fmt.Println(m, n) } // 运行中进行赋值 package main import ( "fmt" "math" ) func main() { a, b := 145.8, 543.8 c := math.Min(a, b) fmt.Println("minimum value is ", c) } // 简单声明时包含之前声明过的变量 package main import "fmt" func main() { a, b := 20, 30 // 声明变量a和b fmt.Println("a is", a, "b is", b) b, c := 40, 50 // b已经声明,但c尚未声明 fmt.Println("b is", b, "c is", c) b, c = 80, 90 // 给已经声明的变量b和c赋新值 fmt.Println("changed b is", b, "c is", c) }

2|34. 匿名变量(空白符)

  • 类似python中的解压缩时,用_代替不需要的值。 匿名变量用一个下划线_表示,用来接收舍弃的值,且无法调用 _

    func foo() (int, string) { return 10, "test_name"; } func main() { x, _ := foo() _, y := foo() fmt.Println("x_val", x) fmt.Println("y_val", y) }
  • 匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。 (在Lua等编程语言里,匿名变量也被叫做哑元变量

2|45. 注意小结

  • 函数外的每个语句都必须以关键字开始(var、const、func等)

  • **:= 不能使用在函数外 **

  1. _ 多用于占位,表示忽略值,无法使用

3|0三、常量

  • 什么是常量

  • 常量是恒定不变的值,多用于定义程序运行期间不会改变的那些值

  • 声明常量只是把var换成了const,**常量在定义的时候必须赋值,且常量的值在编译的时候就是确定下来的,因此 等号 右侧不能出现需要计算的表达式 **

1.普通声明常量方式: const pi = 3.1415 const e = 2.7182 2.批量声明不同值的常量方式: const ( pi = 3.1415 e = 2.7182 ) 3.批量声明同一值的常量:const同时声明多个常量时,如果省略了值则表示和上面一行的值相同 const ( n1 = 100 n2 n3 ) 4. 定义需要计算的常量会报错 package main import ( "fmt" "math" ) func main() { fmt.Println("Hello, playground") var a = math.Sqrt(4) // 允许 const b = math.Sqrt(4) // 不允许 } // 常量的值会在编译的时候确定。因为函数调用发生在运行时,所以不能将函数的返回值赋值给常量 5. 数字常量的运用,只有数字常量可以这样赋值,字符串常量、布尔常量都不行(见5.1 5.2 示例) package main import ( "fmt" ) func main() { const a = 5 var intVar int = a var int32Var int32 = a var float64Var float64 = a var complex64Var complex64 = a fmt.Println("intVar",intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var",complex64Var) } // 打印结果 intVar 5 int32Var 5 float64Var 5 complex64Var (5+0i) 5.1 字符串常量 package main func main() { var defaultName = "Sam" // 允许 type myString string // 定义一个我们自己的类型mystring,本质用法和string是一样的 var customName myString = "Sam" // 允许 customName = defaultName // 不允许 } 5.2 布尔常量 package main func main() { const trueConst = true type myBool bool // 定义一个我们自己的类型myBool,本质用法和bool是一样的 var defaultBool = trueConst // 允许 var customBool myBool = trueConst // 允许 defaultBool = customBool // 不允许 }

4|0四、iota(暂时了解)

  • 什么是iota

    • iota是go语言的常量计数器,只能在常量的表达式中使用
    • iota在const关键字出现时将被重置为0。const中每新增一行常量声明将使iota计数一次
    • iota**可理解为const语句块中的行索引 **
  • 5种实例:

    1. 普通例子 const ( n1 = iota //0 n2 //1 n3 //2 n4 //3 ) 2. 使用_跳过某些值 const ( n1 = iota //0 n2 //1 _ n4 //3 ) 3.iota声明中间插队 const ( n1 = iota //0 n2 = 100 //1 n3 = iota //2 n4 //3 ) const n5 = iota //0 4. 定义数量级 // 这里的<<表示左移操作,1<<10表示将1的二进制表示向左移10位,也就是由1变成了10000000000,也就是十进制的1024。同理2<<2表示将2的二进制表示向左移2位,也就是由10变成了1000,也就是十进制的8 const ( _ = iota KB = 1 &lt;&lt; (10 * iota) MB = 1 &lt;&lt; (10 * iota) GB = 1 &lt;&lt; (10 * iota) TB = 1 &lt;&lt; (10 * iota) PB = 1 &lt;&lt; (10 * iota) ) 5. 多个iota定义在一行 const ( a, b = iota + 1, iota + 2 //1,2 c, d //2,3 e, f //3,4 )

__EOF__

本文作者BigSun丶
本文链接https://www.cnblogs.com/Mcoming/p/11946232.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   BigSun丶  阅读(268)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示