1、转义字符
常用的转义字符有如下:
1) \t : 表示一个制表符,通常使用它可以排版。
2) \n:换行符
3) \:一个\
4) ":一个”
**5)**\r:一个回车
2、数据类型概述
在 Go 编程语言中,数据类型用于声明函数和变量。
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。
3、整型
用于存放整数值的,比如 0, 1、2、3、4、5 等等
无符号类型可以存放的正数范围比有符号整型中的范围大一倍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package main
import ( "fmt" "unsafe" )
func main() { var i int = 255 fmt.Printf("i的类型是%T,占用字节数为%d", i, unsafe.Sizeof(i)) }
i的类型是int,占用字节数为8
|
4、字符型
字符串中的每一个元素叫做“字符”,在遍历或者单个获取字符串元素时可以获得字符。
Go语言的字符有以下两种:
1)一种是 uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。
2)另一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。
byte 类型是 uint8 的别名,对于只占用 1 个字节的传统 ASCII 编码的字符来说,完全没有问题,例如 var ch byte = ‘A’,字符使用单引号括起来。
Golang 中没有专门的字符类型,如果要存储单个字符(字母),一般使用 byte 来保存。
查看字符码值转换地址:
http://www.mytju.com/classcode/tools/encode_utf8.asp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| package main
import "fmt"
func main() { var c1 byte = 'a' var c2 byte = '0' var c3 rune = '测'
fmt.Printf("c3的数据格式是%T\n", c3) fmt.Printf("c1=%c,c2=%c,c3=%c\n", c1, c2, c3) fmt.Println(c1, c2, c3)
var n1 = 10 + '测' fmt.Println(n1) fmt.Printf("n1=%c", n1) }
c3的数据格式是int32 c1=a,c2=0,c3=测 97 48 27979 27989 n1=浕
|
备注:字符类型使用细节
**1)**字符型存储到计算机中,需要将字符对应的码值(整数)找出来存储:
字符—>对应码值>二进制–>存储
读取:二进制—-> 码值 —-> 字符 –> 读取
**2)**字符和码值的对应关系是通过字符编码表决定的(是规定好)
3) Go 语言的编码都统一成了 utf-8。非常的方便,很统一,再也没有编码乱码的困扰了
**4)**字符常量是用单引号(‘’)括起来的单个字符。例如:
1 2 3
| var c1 byte = 'a' var c2 int = '中' var c3 byte = '9'
|
**5)**Go 中允许使用转义字符 ‘\’来将其后的字符转变为特殊字符型常量。例如:var c3 char = ‘\n’
英文字母-1 个字节 汉字-3 个字节
**7)**在 Go 中,字符的本质是一个整数,直接输出时,是该字符对应的 UTF-8 编码的码值。
**8)**可以直接给某个变量赋一个数字,然后按格式化输出时%c,会输出该数字对应的 unicode 字符
**9)**字符类型是可以进行运算的,相当于一个整数,因为它都对应有 Unicode 码.
5、布尔类型
一个布尔类型的值只有两种:true 或 false(不写话默认为false)。if 和 for 语句的条件部分都是布尔类型的值,并且==和<等比较操作也会产生布尔型的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package main
import ( "fmt" "unsafe" )
func main() { var a bool = false var b bool = true fmt.Println(a, b)
fmt.Printf("a的占用字节数%d,a的类型是%T\n", unsafe.Sizeof(a), a)
var d = 1 var e = 2 if d > e { fmt.Println("true") } else { fmt.Println("false") } }
false true a的占用字节数1,a的类型是bool false
|
6、字符串类型
字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| package main
import "fmt"
func main() { var str1 string = "hello man" fmt.Println(str1)
str2 := `cesj\n\r` fmt.Println(str2)
str2 += "拼接上" fmt.Println(str2)
str3 := "adsa" + "adas" + "asdadawds" fmt.Println(str3)
}
hello man cesj\n\r cesj\n\r拼接上 adsaadasasdadawds
|
6、基本数据类型默认值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package main
import "fmt"
func main() { var a int var b float32 var c float64 var d bool
var e string
fmt.Printf("a=%v,b=%v,c=%v.d=%v,e=%v", a, b, c, d, e)
}
a=0,b=0,c=0.d=false,e=
|
7、基本数据类型相互转换
在程序开发中,我们经常将基本数据类型转成 string,或者将 string 转成基本数据类型。
7.1 基本数据类型转string
fmt.Sprintf(“%参数”, 表达式)
注意:参数需要和表达式的数据类型相匹配
fmt.Sprintf().. 会返回转换后的字符串
%d表示是整数
%f表示的是浮点数
%t表示的是布尔类型
%c表示的byte类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| package main
import "fmt"
func main() { var num1 int = 1 var num2 float64 = 8.7 var b bool = true var cha byte = 'a' var str string
str = fmt.Sprintf("%d", num1) fmt.Printf("str的数据类型是%T str=%q\n", str, str)
str = fmt.Sprintf("%f", num2) fmt.Printf("str的数据类型是%T, str=%q\n", str, str)
str = fmt.Sprintf("%t", b) fmt.Printf("str的数据类型是%T str=%q\n", str, str)
str = fmt.Sprintf("%c", cha) fmt.Printf("str的数据类型是%T str=%q", str, str) }
str的数据类型是string str="1" str的数据类型是string, str="8.700000" str的数据类型是string str="true" str的数据类型是string str="a"
|
7.2 string转基本数据类型
使用strconv包
在标准官方库文档有:
https://studygolang.com/static/pkgdoc/pkg/strconv.htm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
package main
import ( "fmt" "strconv" )
func main() { var str string = "true" var b bool b, _ = strconv.ParseBool(str) fmt.Printf("b type %T\nb=%v\n", b, b)
var str1 string = "12" var n1 int64 var n2 int n1, _ = strconv.ParseInt(str1, 10, 64) fmt.Printf("n1 type %T\nn1=%v\n", n1, n1) n2 = int(n1) fmt.Printf("n2 type %T\nn2=%v\n", n2, n2)
var str2 = "12.6" var f1 float64 f1, _ = strconv.ParseFloat(str2, 64) fmt.Printf("f1 type %T\nf1=%v\n", f1, f1)
var str3 = "hello" var n3 int64 n3, _ = strconv.ParseInt(str3, 10, 64) fmt.Printf("n3 type %T\nn3=%v\n", n3, n3)
}
b type bool b=true n1 type int64 n1=12 n2 type int n2=12 f1 type float64 f1=12.6 n3 type int64 n3=0
|
8、指针
Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算。Go语言中的指针操作非常简单,只需要记住两个符号:&
(取地址)和*
(根据地址取值)。
一个指针变量可以指向任何一个值的内存地址,它所指向的值的内存地址在 32 和 64 位机器上分别占用 4 和8 个字节,占用字节的大小与所指向的值的大小无关。当一个指针被定义后没有分配到任何变量时,它的默认值为 nil。指针变量通常缩写为 ptr。
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用在变量名前面添加&操作符(前缀)来获取变量的内存地址(取地址操作),格式如下:
1 2 3
| var i int = 10 var ptr \*int = &i
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| package main
import "fmt"
func main() { var num int = 1 var str string = "home" fmt.Printf("num:%p.str:%p", &num, &str) }
num:0xc0000180a8.str:0xc00005e260
|
使用 fmt.Printf 的动词%p
打印 num和 str 变量的内存地址,指针的值是带有0x
十六进制前缀的一组数据。
现在我们已经了解了什么是内存地址和如何去访问它。接下来我们将具体介绍指针。
一个指针变量指向了一个值的内存地址。
在使用指针前你需要声明指针。指针声明格式如下
1 2 3 4 5
| var 变量名 *var-type
var ip *int var fp *float32
|
8.1 指针使用流程:
1、定义指针变量。
2、为指针变量赋值。
3、访问指针变量中指向地址的值。
在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package main
import "fmt"
func main() { var i int = 10 fmt.Printf("i的地址=%v", &i)
var ptr *int = &i fmt.Printf("ptr=%v\n", ptr) fmt.Printf("ptr地址=%v\n", &ptr) fmt.Printf("ptr指向的值=%v\n", *ptr)
}
i的地址=0xc0000180a8ptr=0xc0000180a8 ptr地址=0xc00000a030 ptr指向的值=10
|
8.2 总结:
\1) 基本数据类型,变量存的就是值,也叫值类型
\2) 获取变量的地址,用&,比如: var num int, 获取 num 的地址:&num
\3) 指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值比如:var ptr *int = &num
4)获取指针类型所指向的值,使用:*,比如:var ptr int, 使用ptr 获取 ptr 指向的值