首页 > 其他分享 >Go语言错误总结(三)

Go语言错误总结(三)

时间:2022-11-25 13:02:46浏览次数:39  
标签:总结 log 错误 utf8 fmt 字符串 Go byte main


15、Strings无法修改

尝试使用索引操作来更新字符串变量中的单个字符将会失败。string是只读的byte slice(和一些额外的属性)。如果你确实需要更新一个字符串,那么使用byte slice,并在需要时把它转换为string类型。

错误代码:

package main

import "fmt"

func main() {
x := "text"
x[0] = 'T'
fmt.Println(x)
}

编译错误:

./main.go:7:7: cannot assign to x[0]

正确代码:

package main

import "fmt"

func main() {
x := "text"
xbytes := []byte(x)
xbytes[0] = 'T'
fmt.Println(string(xbytes)) //prints Text
}

需要注意的是:这并不是在文字string中更新字符的正确方式,因为给定的字符可能会存储在多个byte中。如果你确实需要更新一个文字string,先把它转换为一个rune slice。即使使用rune slice,单个字符也可能会占据多个rune,比如当你的字符有特定的重音符号时就是这种情况。这种复杂又模糊的“字符”本质是Go字符串使用byte序列表示的原因。

16、String和Byte Slice之间的转换

当你把一个字符串转换为一个byte slice(或者反之)时,你就得到了一个原始数据的完整拷贝。这和其他语言中cast操作不同,也和新的slice变量指向原始byte slice使用的相同数组时的重新slice操作不同。

Go在[]byte到string和string到[]byte的转换中确实使用了一些优化来避免额外的分配(在todo列表中有更多的优化)。

第一个优化避免了当[]byte keys用于在map[string]集合中查询时的额外分配:m[string(key)]。

第二个优化避免了字符串转换为[]byte后在for range语句中的额外分配:for i,v := range []byte(str) {…}。

17、String和索引操作

字符串上的索引操作返回一个byte值,而不是一个字符(和其他语言中的做法一样)。

 

package main

import "fmt"

func main() {
x := "text"
fmt.Println(x[0]) //print 116
fmt.Printf("%T\n", x[0]) //prints uint8
}

运行结果:

 

116
uint8

如果你需要访问特定的字符串“字符”(unicode编码的points/runes),使用for range。官方的“unicode/utf8”包和实验中的utf8string包(golang.org/x/exp/utf8string)也可以用。utf8string包中包含了一个很方便的At()方法。把字符串转换为rune的切片也是一个选项。

18、字符串不总是UTF8文本

字符串的值不需要是UTF8的文本。它们可以包含任意的字节。只有在string literal使用时,字符串才会是UTF8。即使之后它们可以使用转义序列来包含其他的数据。

为了知道字符串是否是UTF8,你可以使用“unicode/utf8”包中的ValidString()函数。

package main

import (
"fmt"
"unicode/utf8"
)

func main() {
data1 := "ABC"
fmt.Println(utf8.ValidString(data1)) //prints: true
data2 := "A\xfeC"
fmt.Println(utf8.ValidString(data2)) //prints: false
}

运行结果:

true
false

19、字符串的长度

让我们假设你是Python开发者,你有下面这段代码:

data = u'♥'  
print(len(data)) #prints: 1

当把它转换为Go代码时,你可能会大吃一惊。

package main
import "fmt"
func main() {
data := "♥"
fmt.Println(len(data)) //prints: 3
}

内建的 len()函数返回byte的数量,而不是像Python中计算好的unicode字符串中字符的数量。

要在Go中得到相同的结果,可以使用“unicode/utf8”包中的 RuneCountInString()函数。

package main
import (
"fmt"
"unicode/utf8"
)
func main() {
data := "♥"
fmt.Println(utf8.RuneCountInString(data)) //prints: 1
}

运行结果:

1

理论上说 RuneCountInString()函数并不返回字符的数量,因为单个字符可能占用多个rune。

package main
import (
"fmt"
"unicode/utf8"
)
func main() {
data := "é"
fmt.Println(len(data)) //prints: 3
fmt.Println(utf8.RuneCountInString(data)) //prints: 2
}

运行结果:

3
2

20、在多行的Slice、Array和Map语句中遗漏逗号

package main
func main() {
x := []int{
1,
2
}
_ = x
}

编译错误:

./main.go:6:4: syntax error: unexpected newline, expecting comma or }

正确代码:

package main
func main() {
x := []int{
1,
2,
}
x = x
y := []int{3, 4}
y = y
}

当你把声明折叠到单行时,如果你没加末尾的逗号,你将不会得到编译错误。

21、log.Fatal和log.Panic不仅仅是Log

Logging库一般提供不同的log等级。与这些logging库不同,Go中log包在你调用它的Fatal()和Panic()函数时,可以做的不仅仅是log。当你的应用调用这些函数时,Go也将会终止应用

package main
import "log"
func main() {
log.Fatalln("Fatal Level: log entry") //app exits here
log.Println("Normal Level: log entry")
}

运行结果:

2018/05/29 22:13:00 Fatal Level: log entry
exit status 1

标签:总结,log,错误,utf8,fmt,字符串,Go,byte,main
From: https://blog.51cto.com/u_13940603/5886361

相关文章

  • Go语言错误总结(二)
    8、使用“nil”SlicesandMaps在一个nil的slice中添加元素是没问题的,但对一个map做同样的事将会生成一个运行时的panic。正确代码:packagemainfuncmain(){vars[]i......
  • Go语言错误总结(五)
    29、未导出的结构体不会被编码以小写字母开头的结构体将不会被(json、xml、gob等)编码,因此当你编码这些未导出的结构体时,你将会得到零值。packagemainimport("encoding/......
  • Go语言错误总结(四)
    22、内建的数据结构操作不是同步的即使Go本身有很多特性来支持并发,并发安全的数据集合并不是其中之一,确保数据集合以原子的方式更新是你的职责。Goroutines和channels是实现......
  • Go 操作 MySQL 数据库
    这一期讲一讲如何使用Go操作MySQL数据库,这里就不讲MySQL的安装以及配置了,但要记得开启MySQL服务,我这里使用的是MySQL8.0.20版本。加载数据库驱动想要连接到数据......
  • Go 的 MySQL 预处理、MySQL 事务
    预处理是什么在普通SQL语句执行过程中,客户端会对SQL语句进行占位符替换,从而得到要执行的完整SQL语句,客户端再将此SQL语句发送到服务端执行,服务端最后把结果返回给客......
  • go实现投票并实时打印投票信息
    packagemainimport"fmt"varstudents[]Studentvarflagbool=truetypeStudentstruct{noint//候选人编号namestring//候选热姓名countint//得票数}fun......
  • 咕噜校园项目总结
    咕噜校园项目功能解刨技术分析校园后台:正方软件后台系统抓包登录:抓取账号密码,看看加密各方面查看请求参数成功和失败动作课表查询抓取URL查看请求参数解......
  • 4 django_Adimn账户
    1.创建管理员账号退出服务器输入命令pythonmanage.pycreatesuperuser启动服务器pythonmanage.pyrunserver输入网址:http://127.0.0.1:8000/admin/logi......
  • 二分查找总结
    二分查找二分查找也常被称为二分法或者折半查找(BinarySearch),每次查找时通过将待查找区间分成两部分并只取一部分继续查找,将查找的复杂度大大减少。对于一个长度为O(n) ......
  • 错误 CS1617 Invalid option '7.3' for /langversion; must be ISO-1, ISO-2, Default
    一年前的程序版本拉下来需要改动下,突然生成程序报这个错。解决方法,网上说修改项目属性-生成-高级,语言版本选择default。我这个项目就不能修改,后来查了下https://stac......