Golang 基本数据类型,常量,数组,切片,字符串

整数

int8、int16、int32、int64
uint8、uint16、uint32、uint64
int、uint (不同的编译器即使在相同的硬件平台上可能产生不同的大小)
uintptr 无符号的整数类型。指针大小
优先级递减


*      /      %      <<       >>     &       &^
+      -      |      ^
==     !=     <      <=       >      >=
&&
||

bit位操作运算符
Printf函数的%b参数打印二进制格式的数字

&      位运算 AND
|      位运算 OR
^      位运算 XOR
&^     位清空 (AND NOT)    先非再与
<<     左移
>>     右移

Printf打印
%之后的[1]副词告诉Printf函数再次使用第一个操作数。
%后的#副词告诉Printf在用%o、%x或%X输出时生成0、0x或0X前缀。

package main
import "fmt"
func main() {
   
	o := 0666
	fmt.Printf("%d %[1]o %#[1]o \n", o)
	x := int64(0xdeadbeef)
	fmt.Printf("%d %[1]x %#[1]x %#[1]X  \n", x)
}

在这里插入图片描述

浮点数

float32和float64
Printf打印
Printf函数的%g参数打印浮点数,将采用更紧凑的表示形式打印,并提供足够的精度,但是对应表格的数据,使用%e(带指数)或%f的形式打印可能更合适

复数

complex64和complex128

var x complex128 = complex(1, 2) // 1+2i
var y complex128 = complex(3, 4) // 3+4i
fmt.Println(x*y)                 // "(-5+10i)"
fmt.Println(real(x*y))           // "-5"
fmt.Println(imag(x*y))           // "10"

x := 1 + 2i
y := 3 + 4i

布尔

bool
%t

func main() {
   
	var a bool = false;
	fmt.Println(a)
	fmt.Printf("%d", a)
}

blog.csdnimg.cn/20200407144719858.png)
布尔值并不会隐式转换为数字值0或1

字符串

底层为[]byte

\uFFFD  无效字符
fmt.Println(string(1234567)) // "�"

在这里插入图片描述

package main
import "fmt"
func main() {
   
	s := "hello, world"

	// len 长度
	fmt.Println(len(s))		// 12
	fmt.Println(s[0], s[7]) // 104 119
	fmt.Printf("%c, %c\n", s[0], s[7])
	
	// 越界导致panic异常
	// c := s[len(s)] //  wpanic: runtime error: index out of range
	// fmt.Println(c)

	// 生成一段新的字符 子字符串操作s[i:j]
	fmt.Println(s[:5]) // "hello"
	fmt.Println(s[7:]) // "world"
	fmt.Println(s[:])  // "hello, world"

	// 无法单个修改
	// s[0] = 'c' // cannot assign to s[0]

	// range循环在处理字符串的时候,会自动隐式解码UTF8字符串
	for i, r := range "Hello, 世界" {
   
		fmt.Printf("%d\t%q\t%d\n", i, r, r)
	}
}

byte rune

byte 的操作单位是一个字节,可以理解为一个英文字符
rune 的操作单位是一个字符,不管这个字符是什么字符

type rune = uint32
type byte = uint8

golang中string底层是通过byte数组实现的。中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。

package main
import (
	"fmt"
	"unicode/utf8"
)

func main() {
   
	var str = "hello, 世界"
	// 计算的是底层byte数组的字节数
	fmt.Println("len(str):", len(str))							   // 13
	
	// 获取到str的字符串长度:
	// 通过 utf8.RuneCountInString获取实际字符串
	fmt.Println("RuneCountInString:", utf8.RuneCountInString(str)) // 9

	// 通过包装城rune类型数组
	fmt.Println("rune:", len([]rune(str)))						   // 9

	// 如何处理真实字符:
	// 1. UTF8解码器
	for i := 0; i < len(str); {
   
		// 返回字符和采用UTF8编码后的编码字节数目
		r, size := utf8.DecodeRuneInString(str[i:])
		fmt.Printf("%d\t%c, size=%d\n", i, r, size)
		i += size
	}
	fmt.Println(".....................")

	// 2.range循环会自动隐式解码UTF8字符串
	for index, r := range str {
   
		fmt.Printf("%d\t%c\n", index, r)
	}
	fmt.Println(".....................")

	// 因为2,可以直接统计字符串数
	n := 0
	for range str {
   
		n++
	}
	fmt.Println("size = ", n)	// size =  9
}


在这里插入图片描述
在这里插入图片描述

bytes、strings、strconv和unicode包 处理字符串

参考
strings包提供了许多如字符串的查询、替换、比较、截断、拆分和合并等功能。

bytes包也提供了很多类似功能的函数,但是针对和字符串有着相同结构的[]byte类型。因为字符串是只读的,因此逐步构建字符串会导致很多分配和复制。在这种情况下,使用bytes.Buffer类型将会更有效,稍后我们将展示。

strconv包提供了布尔型、整型数、浮点数和对应字符串的相互转换,还提供了双引号转义相关的转换。

unicode包提供了IsDigit、IsLetter、IsUpper和IsLower等类似功能,它们用于给字符分类。每个函数有一个单一的rune类型的参数,然后返回一个布尔值。而像ToUpper和ToLower之类的转换函数将用于rune字符的大小写转换。所有的这些函数都是遵循Unicode标准定义的字母、数字等分类规范。strings包也有类似的函数,它们是ToUpper和ToLower,将原始字符串的每个字符都做相应的转换,然后返回新的字符串。

strings:
HasPrefix 判断字符串 s 是否以 prefix 开头:
strings.HasPrefix(s, prefix string) bool

HasSuffix 判断字符串 s 是否以 suffix 结尾:
strings.HasSuffix(s, suffix string) bool

Contains 判断字符串 s 是否包含 substr:
strings.Contains(s, substr string) bool

Index 返回字符串 str 在字符串 s 中的索引(str 的第一个字符的索引),-1 表示字符串 s 不包含字符串 str:
strings.Index(s, str string) int

LastIndex 返回字符串 str 在字符串 s 中最后出现位置的索引(str 的第一个字符的索引),-1 表示字符串 s 不包含字符串 str:
strings.LastIndex(s, str string) int

如果需要查询非 ASCII 编码的字符在父字符串中的位置,建议使用以下函数来对字符进行定位:
strings.IndexRune(s string, r rune) int

Replace 用于将字符串 str 中的前 n 个字符串 old 替换为字符串 new,并返回一个新的字符串,如果 n = -1 则替换所有字符串 old 为字符串 new:
strings.Replace(str, old, new, n) string

Count 用于计算字符串 str 在字符串 s 中出现的非重叠次数:
strings.Count(s, str string) int

Repeat 用于重复 count 次字符串 s 并返回一个新的字符串:
strings.Repeat(s, count int) string

ToLower 将字符串中的 Unicode 字符全部转换为相应的小写字符:
strings.ToLower(s) string

ToUpper 将字符串中的 Unicode 字符全部转换为相应的大写字符:
strings.ToUpper(s) string

TrimSpace 用于修剪字符串,剔除字符串开头和结尾的空白符号
strings.TrimSpace(s)

将开头和结尾的 str 去除掉
strings.Trim(s, str string) 

将会利用 1 个或多个空白符号来作为动态长度的分隔符将字符串分割成若干小块,并返回一个 slice,如果字符串只包含空白符号,则返回一个长度为 0 的 slice。
strings.Fields(s) 

用于自定义分割符号来对指定字符串进行分割,同样返回 slice。
strings.Split(s, sep) 

Join 用于将元素类型为 string 的 slice 使用分割符号来拼接组成一个字符串:
strings.Join(sl []string, sep string) string

函数 strings.NewReader(str) 用于生成一个 Reader 并读取字符串中的内容,然后返回指向该 Reader 的指针,从其它类型读取内容的函数还有:

Read()[]byte 中读取内容。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值