《Go语言入门到进阶实战》学习笔记:第二章 Go语言基本语法与使用

2.1变量

1、变量声明

(1)标准格式:

var 变量名 变量类型

(2)批量格式:

var (

变量名 变量类型

变量名 变量类型

)

2、初始化变量

(1)变量默认值

整型和浮点型默认值为0;字符串变量默认值为空字符串;布尔类型默认为bool;切片、函数、指针变量默认为nil。

(2)初始化标准格式

var 变量名 类型=表达式

(3)编译器推导类型的格式

var 变量名=表达式

(4)短变量声明并初始化

变量名:= 表达式  (左值变量必须是没有定义过的变量,多个短变量声明和赋值中,至少有一个新声明的变量出现在左值中)

3、多个变量同时赋值

var a int = 100

var b int = 200

a,b = b,a   实现交换

4、匿名变量

匿名变量的表现是一个下划线"_",使用匿名变量的地方用下划线代替。

例:a,_=100,200

匿名变量不占用命名空间也不分配内存。

2.2数据类型

1、整型

按长度分为:int8、int16、int32、int64

对应的无符号整型:uint8、uint16、uint32、uint64

2、浮点型

分为:float32,float64,使用%f打印

示例:输出正弦函数图像:https://blog.csdn.net/qq_36214481/article/details/88719070

3、布尔类型

真(true)和假(false)。不允许将布尔类型强制转换为整型。

4、字符串

字符串在Go语言中以原生数据类型出现,和整型等一样。转义字符

 字符串用双引号引起来,多行字符串需要使用反引号(键盘1旁边的键),反引号中所有的转义字符均无效,文本原样输出。

5、字符

Go中字符有两种:

一、unit8类型,或者叫byte型,代表了ASCII码的一个字符。

二、rune类型,代表了一个UTF-8字符。当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。rune类型是一个int32。

6、切片-能动态分配的空间

切片是一个拥有相同类型元素的可变长序列。声明方式

var name []T

T代表切片元素类型。

例:a:=make([]int,3)  //创建一个容量为3的整型切片

a[0]=1//切片元素赋值

2.3类型转换

T(表达式)

T代表类型名

2.4指针

指针在Go中分为两个核心概念。

一、类型指针,允许对这个指针类型的数据进行修改。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算。

二、切片,由指向起始元素的原始指针、元素数量和容量组成。

1、指针地址和指针类型

Go中使用&作为取地址符。

    var cat int = 1
	var str string = "banana"
	fmt.Printf("%p,%p",&cat,&str)//输出两个变量的地址

2、从指针中获取指针指向的值

Go中使用*获取指针的值。

    //准备一个字符串类型
	var house = "Malibu Point 10880,90265"
	//对字符串取值,ptr类型为string*
	ptr:=&house
	//打印ptr类型
	fmt.Printf("ptr type:%T\n",ptr)
	//打印ptr指针地址
	fmt.Printf("address:%p\n",ptr)
	//对指针进行取值操作
	value:=*ptr
	//取值后类型
	fmt.Printf("value type:%T\n",value)
	//指针取值后就是指向变量的值
	fmt.Printf("value:%s\n",value)

变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

(1)对变量进行取地址(&)操作,可以获取变量的指针变量。

(2)指针变量的值是指针地址。

(3)对指针变量进行取值(*)操作,可以获取指针变量指向的原变量的值。

3、使用指针修改值

//交换函数
func swap(a,b *int)  {
	//取a指针的值,赋值给临时变量t
	t:=*a
	//取b指针的值,赋给a指针指向的变量
	*a=*b
	//将a指针的值赋给b指针指向的变量
	*b=t
}

4、示例:使用指针变量获取命令行的输入信息

//定义命令行参数
var mode = flag.String("mode","","process mode")
func main()  {
	//解析命令行参数
	flag.Parse()
	//输出命令行参数
	fmt.Println(*mode)
}

5、创建指针的另一种方法--new()函数

示例:

str := new(string)

*str = "ninja"

fmt.Println(*str)

2.5变量生命周期

省略

2.6字符串应用

1、字符串长度

len()函数获取切片、字符串、通道等的长度

    tip1:="genji is a ninja"
	fmt.Println(len(tip1))
	//Go中字符串以UTF-8保存,每个中文占3个字节
	tip2:="忍"
	fmt.Println(len(tip2))

 如果按照习惯上的字符个数来计算,就需要使用Go中UTF-8包中的RuneCountInString()函数

fmt.Println(utf8.RuneCountInString("忍者"))

 总结:ASCII字符串长度使用len(),Unicode字符串长度使用utf8.RuneCountInString()函数。

2、遍历字符串

(1)遍历ASCII字符串

    theme:="狙击start"
	for i:=0;i<len(theme) ;i++  {
		fmt.Printf("ascii: %c %d",theme[i],theme[i])
	}

(2)遍历Unicode字符串

    for _,s :=range theme{
		fmt.Printf("Unicode: %c %d\n",s,s)
	}

总结:遍历ASCII字符串用len()函数和下标,遍历Unicode字符串用for range

3、获取字符串的某一段字符

        tracer:="死神来了,死神bye bye"
	comma:=strings.Index(tracer,",")

	pos:=strings.Index(tracer[comma:],"死神")
	fmt.Println(comma,pos,tracer[comma+pos:])

strings.Index:正向搜索子串

strings.Last Index:反向搜索子串

搜索的起始位置可以通过切片偏移制作。

4、修改字符串

        angel:="Heros never die"
	//转换为[]byte
	angel_Bytes:=[]byte(angel)
	for i:=5;i<=10 ;i++  {
		angel_Bytes[i]=' '
	}
	fmt.Println(string(angel_Bytes))

总结:

Go语言的字符串是不可变的

修改字符串时,可以将字符串转换为[]byte进行修改

[]byte和string可以通过强制类型转换互转。

5、连接字符串

        hammer:="吃我一锤"
	sickle:="死吧"
	//声明字节缓冲
	var string_Builder bytes.Buffer
	//把字符串写入缓冲
	string_Builder.WriteString(hammer)
	string_Builder.WriteString(sickle)
	//将缓冲以字符串形式输出
	fmt.Println(string_Builder.String())

6、格式化

 7、示例:base64编码

import (
	"encoding/base64"
	"fmt"
	)

func main()  {
	//需要处理的字符串
	message:="Away from keyboard. https://golang.org/"
	//编码消息
	encoded_Message:=base64.StdEncoding.EncodeToString([]byte(message))
	//输出编码完成的消息
	fmt.Println(encoded_Message)
	//解码消息
	data,err:=base64.StdEncoding.DecodeString(encoded_Message)
	//出错处理
	if err!=nil{
		fmt.Println(err)
	}else{
		//打印解码完成的数据
		fmt.Println(string(data))
	}

}

8、类型别名

(1)类型别名和类型定义的区别

类型别名:type Type_Alias = Type

类型定义:type New_Int int

猜你喜欢

转载自blog.csdn.net/qq_36214481/article/details/88688690
今日推荐