七天学习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

  1. 修改字符
package main

import (
	"fmt"
)

func main() {
    
    
	str := "i love you 男士"
	by := []rune(str)
	by[11] = '女'
	fmt.Println(str)
	fmt.Println(string(by))
}

在这里插入图片描述

指针

指针类型是指变量存储的是一个内存地址的变量类型
Go语言中的指针不能进行偏移和运算,因此Go语言中的指针操作非常简单,我们只需要记住两个符号:&(取地址)和*(根据地址取值)。
取变量指针的语法如下:
ptr := &a // a的类型为T
其中:
a:代表被取地址的变量,类型为T
ptr:用于接收地址的变量,ptr的类型就为 * T,称做T的指针类型。* 代表指针。
举个例子:

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) //输出打印变量值
}

在这里插入图片描述

这个指针类型确实不是很容易理解,我白扯老半天,大家多敲代码多试验,好了,今天的分享就先到这,明天我会为大家分享四个类型以及函数相关,每天学习十分钟,卷死别人​

猜你喜欢

转载自blog.csdn.net/weixin_48421613/article/details/123200980