跳至主要內容

字符类型

LincZero大约 2 分钟

字符类型

字符类型

Go像C的Char那样的字符类型,但可以用byte类型保存 (等价uint8),如果是中文等更大的字集则可以用更大的无符号整形来存储。

Go的字符使用的是utf-8编码,查看 utf-8 编码表:http://www.mytju.com/classcode/tools/encode_utf8.asp

(这里需要注意C的char类型可以是有符号也可以是无符号的,虽然C99中定义成有符号的,但具体还是要根据编译器而定,更类似int8_t而非uint8_t。而Go这里是约定用uint8来表示的)

定义+赋值:

var c1 byte = 'a'		// 97
var c2 byte = '6'		// 54
var c3 byte = '(' + 20	// 40 + 20
var c4 byte = '中'		// 报错,溢出,对应的10进制unicode为20013
var c4 int = '中'		// 正确

// 字符类型本质上是整数,直接打印则出来的是数字,也可以直接参数运算
// 赋值的话,字母 数字 标点 汉字等会转Unicode码值码然后再赋值 (其中unicode的0~127范围和ascii码是一样的)

打印:需要使用格式化输出

var c5 byte = 'A'
fmt.Printf("对应字符:%c", c5)

字符串类型

两个特殊点:

  • Go语言字符类型不存在,所以这里的字符串本质上是整形串。不过比整形类型好点的是直接打印出来是字符串
  • 在Go里字符串居然是基本数据类型,其他语言基本不属于
  • 字符串不可变 (这点和Python中的"不可变"的意思是一样的),内存不可变,但可以让指针指向另一内存

定义

var s1 string = "你好世界"
fmt.Println(s1)

var s3 string = 'abc"abc'	// 不合法
var s3 string = "abc\"abc"	// 合法
var s3 string = `abc"a
bc`							// 合法,反引号的使用类似Js,或类似Python raw string

方法

// 赋值。注意Go的字符串是不可变的
var s2 string = "abc"
s2 = "cba" 		// 合法
s2[0] = "t" 	// 不合法
fmt.Println(s2)

// 拼接
var s5 string = "abc" + "def"
s5 += "g" + // 需要注意,由于go的自动加分号特性,这里的加号【必须】在上一行的末尾处
	"hijk"	// (与其他语言不同:Google C++、Python PEP8、Airbnb Js、Oracle Java等其他语言不强制,但都是这么建议的)

(更多方法详见 “模块库/字符串库”)