学 golang 涨工资系列,学习go 基础类型[视频]

发布于:2023-06-30 13:07:18

“In Go, the code does exactly what it says on the page.” – Andrew Gerrand

学go 涨工资,go 的基础类型

hello,这次要和大家分享的是 golang 的基础类型,包括bool/整形/浮点数/字符串 等,希望对大家学习 go 有帮助。

Go 变量标识符

给一个 go 变量命名(标识符)的时候,通常使用大骆驼(BigCamel)和小骆驼(smallCamel)命名法,只要保证不和内置的25个关键词冲突就行。 当然 go 也内置了一些自己的标识符,见下图,我建议你最好不要使用这些同名的预定义标识符来命名变量。 只要是非空的字母或者数字(第一个必须是字母),并且不和关键词冲突就是合法的标识符。注意标识符区分大小写,并且在 go 里边只有大写开头的才能导出被其他包使用(后文我们再讨论)。

go 如何声明一个变量

go 中声明一个变量很简单,使用 var 关键字就可以了,声明之后默认使用其类型的零值初始化。 比如int 类型默认是0,字符串就是空串。

当然为了简化 go 还提供了一种使用 := 直接声明并且初始化的方式。请编写如下代码观察输出(我建议你纯手敲练练手速,不要直接复制):

package main import "fmt" func main() { var i int64 // 声明一个 int64 变量 var b string // 声明一个字符串 fmt.Println("i is ", i) // 0 fmt.Println("b is ", b) // "" // 还有一种简化方式,声明并且赋值,编译器负责推断类型 ii := 1 s := "Hello Go!" fmt.Println("ii is ", ii) // 1 fmt.Println("s is ", s) // Hello Go!" }

Go 的基础类型

无论是学习过程式、面向对象还是并发编程,我们都需要*先学习一门语言的基础类型,对于大部分业务常用编程语言来说就是数值类型和字符串类型。

bool 类型

bool 就是真或者假,一些编程语言使用 0 和非 0 表示。但是 go 里比如 if 语句后边只能是 bool 值或者返回 bool 值的表达式,而不像 c 一样可以使用 int 值。

// 让我们编写一些小的 demo 代码来测试一下 func boolDemo() { var b1 bool b2 := false b3 := true if b1 { fmt.Println("b1 is true") } if b2 { fmt.Println("b2 is true") } if b3 { fmt.Println("b3 is true") } }

数值类型(整型和浮点类型)

整数类型

整数类型可以说是我们最常用的一种类型,如果你用 python 的话非常省心(Python3 int 就是大数类,内存够用无需担心溢出),但是 go 里边却有非常多的 int 类型。 对于一门追求性能的语言来说,有些地方可以省内存就省一点。这里需要注意的就是每种类型取值范围,确保不要超范围了。业务中经常使用也就是 int64/int32 了。

当然作为整数,一般常用的那就是加减乘除之类的数学运算了:

// 同样我们编写简单的测试代码来熟悉它们,确保你不要直接复制粘贴。整本电子书和代码都是笔者一个字一个字敲出来的 func intDemo() { var i64 int64 i64 = 10 fmt.Println(i64 + 10) i32 := int32(42) fmt.Println(i32 + 10) fmt.Println( math.MaxInt64, // 需要导入 math 包,见本章示例代码 ) a, b := 10, 0 fmt.Println(a / b) // Boom! 会发生什么。错误处理我们后文介绍 } func main() { intDemo() // 虽然还没讲到 函数,不过相信你也知道如何调用了 }

浮点数类型

接下来是浮点数,很多场景我们计算的时候都需要有小数点,go 里有两种类型的浮点数。

math 包里很多函数以 float64 作为参数,你可以提前看一下 go 文档看看提供了哪些函数。 浮点数同样也是常见的加减乘除,这里请大家自己编写一些代码来练习,笔者不再赘述。

数值转换小提示

注意不同数值类型之间转换(大转小)可能有截断可以使用 int(float) 转换一个 浮点数到整数,小数部分会丢弃。但是如果浮点数的值超过了整数类型范围,结果是不可预期的注意计算机使用二进制不能精确表示 float 数字,当比较两个浮点数时你要格外小心不能用等号直接比较。(通常作差绝对值小于一个很小的阈值)业务中经常使用 float64,因为 math 函数很多接受 float64 作为参数你可以通过 math.MaxInt32 类似的定义查看一个类型的最大值

复数类型

复数在常见业务代码中使用比较少,这里就略过了。你可以使用 complex() 来创建复数。

延伸(大整数运算)

某些场景下, 如果64位依然满足不了你,你可以使用大整数 http://big.Int 和 有理数 big.Rat 类型。

字符串

业务中另一个最常用的就是字符串(string)了,web 开发几乎天天就是和字符串打交道。Go的字符串是使用 UTF-8 编码的字符序列,这意味着你可以使用任意国家的语言。 Go 中我们可以使用双引号(")和反引号(`)来创建字符串,区别反引号会忽略转义符,并且可以创建多行字符串。

func stringDemo() { // 如果字符串本身也有双引号,就需要把里边的双引号使用 \ 转义 s1 := "\"Hello Go\"" // 使用反斜线就可以直接包含双引号了 s2 := `"Hello Go"` fmt.Println(s1) // 打印出 "Hello Go" fmt.Println(s2) // 打印出 "Hello Go" s3 := ` 你好 ` s4 := "Golang !" fmt.Println(s3 + s4) }

字符串支持如下操作:

字符串和数值类型的转换

在 Python 里进行这种转换是一件很容易的事情,但是 go 里边可不方便。我列出来以下代码你就知道啦:( 视频中有口误, AtoI 是 Ascii to Integer 的缩写)

func testConvert() { // 测试 int 和 string(decimal) 互相转换的函数 // https://yourbasic.org/golang/convert-int-to-string/ // int -> string sint := strconv.Itoa(97) fmt.Println(sint, sint == "97") // byte -> string bytea := byte(1) bint := strconv.Itoa(int(bytea)) fmt.Println(bint) // int64 -> string sint64 := strconv.FormatInt(int64(97), 10) fmt.Println(sint64, sint64 == "97") // int64 -> string (hex) ,十六进制 sint64hex := strconv.FormatInt(int64(97), 16) fmt.Println(sint64hex, sint64hex == "61") // string -> int _int, _ := strconv.Atoi("97") fmt.Println(_int, _int == int(97)) // string -> int64 _int64, _ := strconv.ParseInt("97", 10, 64) fmt.Println(_int64, _int64 == int64(97)) // https://stackoverflow.com/questions/30299649/parse-string-to-specific-type-of-int-int8-int16-int32-int64 // string -> int32,注意 parseInt 始终返回的是 int64,所以还是需要 int32(n) 强转一下 _int32, _ := strconv.ParseInt("97", 10, 32) fmt.Println(_int32, int32(_int32) == int32(97)) // int32 -> string, https://stackoverflow.com/questions/39442167/convert-int32-to-string-in-golang i := 42 strconv.FormatInt(int64(i), 10) // fast strconv.Itoa(int(i)) // fast fmt.Sprint(i) // slow // int -> int64 ,不会丢失精度 var n int = 97 fmt.Println(int64(n) == int64(97)) // string -> float32/float64 https://yourbasic.org/golang/convert-string-to-float/ f := "3.14159265" if s, err := strconv.ParseFloat(f, 32); err == nil { fmt.Println(s) // 3.1415927410125732 } if s, err := strconv.ParseFloat(f, 64); err == nil { fmt.Println(s) // 3.14159265 } }

常量和变量

常量顾名思义你没法改变它,在一些全局变量中使用 const 会更加安全。常量表达式是在编译期计算。 对于一些被整个模块或者其他模块使用的变量来说,最好定义成 const 防止被意外修改。 比如我们会经常在一些文件开头看到类似 const 定义:

const ( Sunday = 0 Monday = 1 Tuesday = 2 Wednesday = 3 Thursday = 4 Friday = 5 Saturday = 6 )

枚举

对于上述这种递增场景,go 还提供了一种更加简洁的方式来定义,使用 iota 表达式,它可以帮助我们完成自增操作(只有这种常见才推荐去使用 iota)

const ( Sunday = iota Monday Tuesday Wednesday Thursday Friday Saturday )

你可以编写代码打印一下看看剩下的值是多少?

小问题:

为什么有 int 还需要 int32 和 int64,业务代码里如何选择呢?请你尝试打印每种 int 类型的数值范围?

本项目 github 地址:

参考(如果文中有错误,欢迎批评指正):

部分图片来自《Go 语言程序设计》Ultimate Visual Guide to Go Enums and iota

文章推荐:


免责声明:本站所有内容及图片均采集来源于网络,并无商业使用,如若侵权请联系删除。

上一篇:推荐!《也曾酒醉鞭名马:**古代文人的B面》让无数读者意犹未尽!

下一篇:2023-02-22:请用go语言调用ffmpeg,保存mp4文件的视频帧,每帧

资讯 观察行业视觉,用专业的角度,讲出你们的心声。
MORE

I NEED TO BUILD WEBSITE

我需要建站

*请认真填写需求信息,我们会在24小时内与您取得联系。