七天学习Go语言-从0-0.04
今天给大家带来的是数据类型以及指针的简单讲解
数据类型
补充说明:
Int/uint/uintptr 这些类型的长度都是根据运行程序所在的操作系统类型决定的。在32位操作系统上就用32位(4字节),在64位操作系统上就用64位(8字节)
字符串的声明和初始化
str := "hello string!
字符串的转义
在go语言中,字符串使用英文双引号(“”)或者反单引号(`)来创建
反单引号用来创建原生的字符串,可能由多行组成,但不支持转义,并且可以包含除反单引号外的其他所有字符
// var.go
package main
import (
"fmt"
)
func main() {
str1 := "\"Go web\", I love you \n " //支持转义,但不能用来引用多行
str2 := `"Go web",
I love you \n ` //支持多行组成,但是不支持转义
fmt.Println(str1)
fmt.Println(str2)
}
字符串的连接
// var.go
package main
import (
"fmt"
)
func main() {
str := "I love" + " you"
str += ", my dear bear two"
fmt.Println(str)
}
字符串的操作值
字符串的内容可以通过标准索引来获取:在方括号“[]”内写入索引,索引从0开始计数
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str := "bageyalu"
fmt.Println(str[0]) //获取字符串索引位置为0的原始字节,即ascii值
fmt.Println(str[0:3]) //获取字符串索引位置为0-3的字符串
fmt.Println(str[0:]) //获取字符串索引位置为0-末尾的字符串
fmt.Println(str[:3]) //获取字符串索引位置截取到3的字符串,不包含3
fmt.Println(len(str)) //获取字符串的字节数
fmt.Println(utf8.RuneCountInString(str)) //获取字符串字符的个数
fmt.Println([]rune(str)) //获取字符串的每一个字节转换的码点值,即ascii值
fmt.Println(string(str[0])) //获取字符串索引位置为0的字符串值
}
字符串的遍历
若是想遍历字符串的字节,需要使用字符串切片,这样反悔的将是一个字符,而不是一个字节
package main
import (
"fmt"
)
func main() {
str := "i love you"
chars := []rune(str)
for _, char := range chars {
fmt.Println(string(char))
}
}
通过for-range将字符串迭代出来
package main
import (
"fmt"
)
func main() {
str := "i love you"
for index, char := range str {
fmt.Printf("%d %U %c \n", index, char, char)
}
}
字符串的修改
在go中,不能直接修改字符串的内容,即不能使用str[i]这种方式进行替换,若是想修改,需要将字符串的内容复制到一个可写的变量中([]byte或[]rune)
1. 修改单个字节
package main
import (
"fmt"
)
func main() {
str := "i love you "
by := []byte(str)
by[10] = '!'
fmt.Printf("%s\n", str)
fmt.Printf("%s\n", by)
}
需要注意的是,修改字节仅能一次修改一个,根据字节的下标进行索引,下标不存在会报错,同样不能修改中文字符,而且替换的内容请用单引号引起,使用双引号同样会报错修改中文字符需要使用切片 []rune
2. 修改字符
package main
import (
"fmt"
)
func main() {
str := "i love you 男士"
by := []rune(str)
by[11] = '女'
fmt.Println(str)
fmt.Println(string(by))
}
package main
import (
"fmt"
)
func main() {
a := 10 // 声明一个字符串变量类型
ptr := &a // 对变量a取地址, ptr的类型为 * int
fmt.Printf("ptr 类型: %T\n", ptr) // 返回ptr的类型
fmt.Printf("ptr指针地址: %p\n", ptr) // 返回ptr的指针地址,其实我觉得这里应该是a的指针地址,ptr的指针地址应该是&ptr
fmt.Printf("ptr指针地址: %p\n", &ptr) // 返回ptr的指针地址
fmt.Printf("a指针地址: %p\n", &a) // 返回a的指针地址
value := *ptr //对指针进行取值(去内存取值)
fmt.Printf("value 类型: %T\n", value) // 返回取值后的类型
fmt.Printf("value去内存后的值: %d\n", value) // 返回指针取值后指向变量的值
fmt.Printf("ptr不取值: %d\n", ptr) // 返回不取值时的样子
}
用指针修改值
package main
import (
"fmt"
)
func exchange(c *int, d *int) {
t := *c //取c指针的值,即*&a,赋值给临时变量t,此时 t = a = 6
*c = *d //取d指针的值,即*&b,赋值给c指针指向的变量,即 *c = *&a = *&b = 8; a=8
*d = t //将临时变量t的值,赋值给d指针指向的变量,即 *&d = *&b = t = 6 ; b=6
//fmt.Println(t) //输出6
//fmt.Println(*c) //输出8
//fmt.Println(*d) //输出6
}
func main() {
a, b := 6, 8 //初始化变量a , b
exchange(&a, &b) //交换变量值
//fmt.Printf("a的指针地址: %p, b的指针地址: %p\n", &a, &b)
//fmt.Printf("a的指针取值: %d, b的指针取值: %d\n", *&a, *&b)
fmt.Println(a, b) //输出打印变量值
}
这个指针类型确实不是很容易理解,我白扯老半天,大家多敲代码多试验,好了,今天的分享就先到这,明天我会为大家分享四个类型以及函数相关,每天学习十分钟,卷死别人