Go程序设计语言读书笔记-第三章

有符号和无符号整数:8位,16位,32位,64位:int8、int16、int32、int64、uint8、uint16、uint32、uint64
浮点数:float32和float64
字符串:内置的len函数返回字符串的字节数,试图访问许可范围以外的字节会触发宕机异常。

s := "left foot"
t := s
s +=", right foor"
s[0] = 'L'  //编译错误,s[0]无法赋值

字符串s不可变意味着两个字符串能安全地共用同一段底层内存,使得复制任何长度字符串的开销都低廉。类似地,字符串s及其字串可以安全地共用数据,因此字串生成操作都开销都低廉。这两种情况下都没有分配内存。图3-4展示了一个字符串及其两个子字符串的内存布局,他们共用底层字节数组。

Go 语言的字符串是不可变的。
修改字符串时,可以将字符串转换为 []byte 进行修改。
[]byte 和 string 可以通过强制类型转换互转。

package main

import "fmt"

func main() {
	angel := "Heros never die"
	angleBytes := []byte(angel)

	angleBytes[0] = 'L'

	fmt.Println(string(angleBytes))
}

字符串常量:"hello,世界"

字符串操作的4个重要标准包:
strings包提供了许多函数,用于搜索,替换、比较、修正、切分与连接字符串。
bytes包也有类似的函数,用于操作字节slice。由于字符串不可变,因此按增量的方式构建字符串会导致多次内存分配和复制。这种情况下,使用bytes.Buffer类型会更高效。
strconv包具备的函数,主要用于转换布尔值、整数、浮点数等。
unicode包辨别文字符号特性的函数。如IsDigit等。

s := "abc"
b := []byte(s)
s2 := string(b)

概念上,[]byte(s)转换操作会分配新的字节数组,拷贝填入s含有的字节,并生成一个slice引用,指向整个数组。具备优化功能的编译器在某些情况下可能会避免内存和复制内容,但一般而言,复制有必要确保s的字节维持不变。
可用bytes包和strings包。

package main

import (
	"bytes"
	"fmt"
)

func intsToString(values []int) string{
	var buf bytes.Buffer
	buf.WriteByte('[')
	for i,v := range values{
		if i>0{
			buf.WriteString(", ")
		}
		fmt.Fprintf(&buf,"%d",v)
	}
	buf.WriteByte(']')
	return buf.String()
}


func main(){
	fmt.Println(intsToString([]int{1,2,3}))

}

strconv包的函数可以相互转换数值及其字符串表示形式。

常量生成器:iota
常量声明可以使用iota,声明中,iota从0开始取值,逐渐加1

type Weekday int

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

Sun的值为0,Monday的值为1,以此类推。

猜你喜欢

转载自blog.csdn.net/Rage_/article/details/88937405