Go语言入门2:基础语法

Keywords: #技术 #Golang #Go 入门笔记
Table of Contents

Go 语言入门基础学习笔记之 Go 语言的基础语法与数据类型

golang

基础语法

Go 标记

Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号

行分隔符

在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。

如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分,但在实际开发中并不鼓励这种做法。

注释

// 单行注释
/*
    多行注释 / 块注释
*/

与 C 语言一致。

标识符

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

这与大多数编程语言的规范一样

比如,maheshkumarabcmove_namea_123myname50_tempja23b9retVal 都是有效标识符。1ab 以数字开头、case 关键字、a+b 其他字符等都是无效字符。

字符串拼接

Go 语言的字符串连接可以通过 +  实现。

fmt.Println("Google" + "Runoob")

关键字

Go 语言一共有 25 个关键字。

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar

除此之外,Go 语言还有 36 个预定义标识符

appendboolbytecapclosecomplex
copyfalsefloat 32float 64imagint
int 32int 64iotalenmakenew
printprintlnrealrecoverstringtrue
complex 64complex 128uint 16int 16uint 32uintptr
panicuint 8uint 64int 8uintnil

Go 语言中的空格

在 Go 语言中,空格通常用于分隔标识符、关键字、运算符和表达式,以提高代码的可读性。

变量的声明必须使用空格隔开

var x int
const Pi float64 = 3.14159265358979323846

变量运算符之间推荐加入空格,程序看起来更加美观

var z int = x + y

关键字表达式之间必须使用空格隔开

if x > 0 {
    // do something
}

在函数调用时,函数名左边等号之间要使用空格,参数之间也要使用空格

result := add(2, 3)

格式化字符串

Go 语言中使用 fmt.Sprintf 或 fmt.Printf 格式化字符串并赋值给新串:

  • Sprintf 根据格式化参数生成格式化的字符串并返回该字符串
  • Printf 根据格式化参数生成格式化的字符串并写入标准输出
package main

import (
    "fmt"
)

func main() {
   // %d 表示整型数字,%s 表示字符串
    var stockcode=123
    var enddate="2024-10-25"
    var url="Code=%d&endDate=%s"
    var target_url=fmt.Sprintf(url,stockcode,enddate)
    fmt.Println(target_url)
    fmt.Printf(url,stockcode,enddate)
}

// 输出结果
Code=123&endDate=2024-10-25
Code=123&endDate=2024-10-25

补充:fmt 包中各种输出方法的区别

  • fmt.Print 原样输出
  • fmt.Printf 格式化输出
  • fmt.Println 各个值之间加空格,末尾加换行

Go 语言中还有一些内建函数,如 println()print(),不属于任何包,直接可以使用。只能简单地输出参数,不支持格式化,通常只用于简单的调试目的。

println()print() 与 fmt 中的 fmt.Printlnfmt.Print 区别一样。

fmt.Print("go","python","php","javascript") // gopythonphpjavascript
fmt.Println("go","python","php","javascript") // go python php javascript
fmt.Printf("go %d", 1) // go 1
println("Hello Go!") // Hello Go!

数据类型

数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。

Go 语言按类别分为以下几种数据类型:

  1. 布尔类型:值只可以是常量 true 或者 false
  2. 数字类型:Go 语言支持整型和浮点型数字,并支持复数,其中位运算采用补码
  3. 字符串型:Go 语言字符串是由单个字节连接起来的,字符串的字节使用 UTF-8 或 Unicode 编码
  4. 派生类型
    1. 指针 Pointer
    2. 数组
    3. 结构化
    4. 通道 Channel
    5. 函数 Function
    6. 切片 Slice
    7. 接口
    8. 集合 Map

引用类型: 切片 Slice指针集合 Map通道 Channel函数

数字类型

整型:Go 也有基于架构的类型,例如:int、uint 和 uintptr

类型描述
uint 8无符号 8 位整型 (0 到 255)
uint 16无符号 16 位整型 (0 到 $2^{16}-1$)
uint 32无符号 32 位整型 (0 到 $2^{32}-1$)
uint 64无符号 64 位整型 (0 到 $2^{64}-1$)
int 8有符号 8 位整型 (-128 到 127)
int 16有符号 16 位整型 ($-2^{15}$ 到 $-2^{15}-1$)
int 32有符号 32 位整型 ($-2^{31}$ 到 $2^{31}-1$)
int 64有符号 64 位整型 ($-2^{63}$ 到 $2^{63}-1$)

在 Go 中 int 是一个不定长的类型,取决于当前计算机的机器字长。如果当前计算机为 64 位,则 int 类型也是 64 位,虽然你这与 int64 的长度是一样的,但是他们依旧是不同的两种数据类型。

浮点型

类型描述
float 32IEEE-754 32 位浮点数
float 64IEEE-754 64 位浮点数
complex 6432 位实数和虚数
complex 12864 位实数和虚数

其他数字类型

类型描述
byte类似 uint 8
rune类似 int 32
uint32 或 64 位
int与 uint 一样大小
uintptr无符号整型, 用于存放一个指针

Go 语言可以通过格式化字符串 %T 打印出数据类型

fmt.Printf("type: %T\n", a)

浮点精度问题

浮点数计算输出有一定的偏差,你也可以转整型来设置精度。

package main
import (
    "fmt"
)
func main() {
    a := 1.69
    b := 1.7
    c := a * b      // 结果应该是2.873
    fmt.Println(c)  // 输出的是2.8729999999999998
}

设置精度

package main
import (
    "fmt"
)
func main() {
    a := 1690           // 表示1.69
    b := 1700           // 表示1.70
    c := a * b          // 结果应该是2873000表示 2.873
    fmt.Println(c)      // 内部编码
    fmt.Println(float64(c) / 1000000) // 显示
}

参考课程:

  1. 8小时转职Golang工程师
  2. Go语言教程 | 菜鸟教程