go语言学习笔记(三)

zhangaijia · · 687 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

分享几门我自学go语言的教程,这几门课可以说是go语言学习的新华字典了!

  1. Go语言从入门到实战——简明高效的Go语言实战指南 

  2. Google资深工程师深度讲解Go语言

  3. Go实战仿百度云盘 实现企业级分布式云存储系统

  4. Go语言实战流媒体视频网站

  5. Go语言开发分布式任务调度 轻松搞定高性能Crontab

  6. 高并发&高性能 Go语言开发企业级抽奖项目

  7. GO从0到1实战微服务版抢红包系统

  8. 【区块链实战】Golang公链项目实战

  9. go语言教程零基础入门到精通

  10. 小白的福音:20小时快速入门Go语言

一、go语言浮点数表示

 

     go语言浮点数类型有两个,即float32和float64。存储这两个类型的值的空间分别需要4个字节和8个字节。

    浮点数类型的值一般由整数部分、小数点“.”和小数部分组成。其中,整数部分和小数部分均由10进制表示法表示。不过还有另一种表示方法。那就是在其中加入指数部分。指数部分由“E”或“e”以及一个带正负号的10进制数组成。比如,3.7E-2表示浮点数0.037。又比如,3.7E+1表示浮点数37。
    有时候,浮点数类型值的表示也可以被简化。比如,37.0可以被简化为37。又比如,0.037可以被简化为.037。

    有一点需要注意,在Go语言里,浮点数的相关部分只能由10进制表示法表示,而不能由8进制表示法或16进制表示法表示。比如,03.7表示的一定是浮点数3.7。

代码实例 go_float.go:

package main
import "fmt"
func main() {
	// 可以在变量声明并赋值的语句中,省略变量的类型部分。
	var num1 = 5.89E-4
	var num2 = 3.78E+4

 
	// 这里用到了字符串格式化函数。其中,%E用于以带指数部分的表示法显示浮点数类型值,
	//%f用于以通常的方法显示浮点数类型值。
	fmt.Printf("浮点数 %E 表示的是:%f \n", num1, num1)
	fmt.Printf("浮点数 %E 表示的是:%f ", num2, num2)
}

二、go语言复数表示

go语言复数类型同样有两个,即complex64和complex128。存储这两个类型的值的空间分别需要8个字节和16个字节。

实际上,complex64类型的值会由两个float32类型的值分别表示复数的实数部分和虚数部分。而complex128类型的值会由两个float64类型的值分别表示复数的实数部分和虚数部分。

复数类型的值一般由浮点数表示的实数部分、加号“+”、浮点数表示的虚数部分,以及小写字母“i”组成。比如,3.7E+1 + 5.98E-2i。

正因为复数类型的值由两个浮点数类型值组成,所以其表示法的规则自然需遵从浮点数类型的值表示法的相关规则。

实例代码 go_fushu.go:

package main
import "fmt"

 
func main() {
	var num1 = 3.7E+4 + 3.14E-2i
	var num2 = 6.18E-2 + 3.14E-2i

 
	fmt.Printf("浮点数 %E 表示的是:%f\n", num1, num1)
	fmt.Printf("浮点数 %E 表示的是:%f", num2, num2)
}

三、go语言的byte和rune

byte与rune类型有一个共性,即:它们都属于别名类型。byte是uint8的别名类型,而rune则是int32的别名类型。

byte类型的值需用8个比特位表示,其表示法与uint8类型无异。

一个rune类型的值即可表示一个Unicode字符。

Unicode是一个可以表示世界范围内的绝大部分字符的编码规范。关于它的详细信息,大家可以参看其官网(http://unicode.org/)上的文档,或在Google上搜索。

用于代表Unicode字符的编码值也被称为Unicode代码点。一个Unicode代码点通常由“U+”和一个以十六进制表示法表示的整数表示。例如,英文字母“A”的Unicode代码点为“U+0041”。

rune类型的值需要由单引号“'”包裹。例如,'A'或'郝'。这种表示方法一目了然。不过,我们还可以用另外几种形式表示rune类型值。 

https://img4.mukewang.com/5b1b829b0001372e08000308.jpg

在rune类型值的表示中支持几种特殊的字符序列,即:转义符。它们由“\”和一个单个英文字符组成。

https://img.mukewang.com/5b1b82c0000131e106880426.jpg

实例代码 go_rune.go:

package main
import "fmt"

 
func main() {
	//声明一个rune类型变量并赋值
	var char1 rune = '赞'
	var char2 rune = 'A'

 
	//字符串格式化函数,%c用于显示rune类型值代表的字符
	fmt.Printf("字符 '%c' 的Unicode代码点是 %s\n", char1, ("U+8D5E"))
	fmt.Printf("字符 '%c' 的Unicode代码点是 %s\n", char2, ("U+0041"))
}

四、go语言字符串类型

一个字符串类型的值可以代表一个字符序列。这些字符必须是被Unicode编码规范支持的。从表象上来说是字符序列,但是在底层,一个字符串值却是由若干个字节来表现和存储的。

一个字符串(也可以说字符序列)会被Go语言用Unicode编码规范中的UTF-8编码格式编码为字节数组。

在一个字符串值或者一个字符串类型的变量之上应用Go语言的内置函数len将会得到代表它的那个字节数组的长度。这可能与我们看到的表象是不同的。

字符串的表示法有两种,即:原生表示法和解释型表示法。

若用原生表示法,需用反引号“`”把字符序列包裹起来。

若用解释型表示法,则需用双引号“"”包裹字符序列。

二者的区别是,前者表示的值是所见即所得的(除了回车符)。在那对反引号之间的内容就是该字符串值本身。而后者所表示的值中的转义符会起作用并在程序编译期间被转义。所以,如此表示的字符串值的实际值可能会与我们看到的表象不相同。

注意,字符串值是不可变的。一旦创建了一个字符串类型的值,就不可能再对它本身做任何修改。

实例代码 go_string.go:

package main
import (
	"fmt"
)

 
func main() {
	// 声明一个string类型变量并赋值
	var str1 string = "\\\""
	var str2 string = "霜花似雪"

 
	// 这里用到了字符串格式化函数。其中,%q用于显示字符串值的表象值并用双引号包裹。
	fmt.Printf("用解释型字符串表示法表示的 %q 所代表的是 %s。\n", str1, `str1`)
	fmt.Printf("字符串str2的值为:%s\n", str2)
	fmt.Printf("字符串str2的长度为:%d\n", len(str2))
	fmt.Printf("字符串拼接后:%s", str2+str1)

 
}

以上实例代码的运行效果如图:

https://img.mukewang.com/5b1b866f000119f107750452.jpg

go语言字符串相关实例代码:

go_string.go

package main
import (
	"fmt"
	"strings"
)
func main() {
	s := "hello world"
	//判断字符串s是否在字符串hello中存在
	fmt.Println(strings.Contains(s, "hello"), strings.Contains(s, "?"))

 
	//输出字符o在字符串中的索引
	fmt.Println(strings.Index(s, "o"))

 
	ss := "1#2#3#456"

 
	//切割字符串
	//采用Split函数根据#作为分隔符,分割字符串
	splitedStr := strings.Split(ss, "#")
	fmt.Println(splitedStr)
	//合并字符串
	fmt.Println(strings.Join(splitedStr, "#"))

 
	//判断字符串s中是否包含he开头的前缀
	fmt.Println(strings.HasPrefix(s, "he"))

 
	////判断字符串s中是否包含ld结尾的后缀
	fmt.Println(strings.HasSuffix(s, "ld"))
}

go_string1.go

package main
import (
	"fmt"
	"strconv"
)
func main() {
	//go语言中整型与字符串相互转换API
	//输入整型数据输出字符串
	fmt.Println(strconv.Itoa(10))
	//输入字符串转化为整型
	fmt.Println(strconv.Atoi("711"))

 
	//字符串解析
	//解析为Bool类型
	fmt.Println(strconv.ParseBool("false")) //0,f,F,false,FALSE,False
	fmt.Println(strconv.ParseBool("True"))  //1,t,T,true,TRUE,True
	//解析为float类型,32是位数,是精度
	fmt.Println(strconv.ParseFloat("3.14", 32))

 
	//格式化
	fmt.Println(strconv.FormatBool(true))
	//FormatInt(123, 10),10表示是10进制,这个函数可以实现进制之间的转化
	fmt.Println(strconv.FormatInt(123, 10)) //十进制
	fmt.Println(strconv.FormatInt(123, 2))  //二进制
	fmt.Println(strconv.FormatInt(20, 16))  //十六进制

 
}

以上两个实例代码的运行效果如图:

https://img.mukewang.com/5b1b86430001e94106030381.jpg

今天的分享到此结束,请诸君多多支持!



链接:http://www.97yrbl.com
来源:猿人部落
本文原创发布于猿人部落 ,转载请注明出处,谢谢合作


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

687 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传