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