Golang系列一:变量和常量

Golang系列一:变量和常量

变量

  • 显式的完整声明
var varName dataType [ = value ]
  • 短类型声明
varName := value

常量

Golang中常量分为布尔型、字符串型、数值型。

基本数据类型

Golang内置七类基本数据类型(20个具体子类型)
(1) 布尔类型:bool
(2) 整型:byte int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr
(3) 浮点型:float32 float64
(4) 复数:complex64 complex128
(5) 字符:rune
(6) 字符串:string
(7) 错误类型:error
  • 布尔类型
    true/false,默认是false
var flag bool
flag = true

flag := false
  • 整型
byte int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr
  • 浮点型
b := 10.00
  • 复数类型

  • 字符串
    (1) 访问
    可以通过类似数组的索引访问其字节单元,但是不能修改某个字节的值。

var a = "hello world"
b := a[0]

(2) 转换为切片
可以转换为字节数组,也可以转换为Unicode字数组。

a := "hello world"
b := []byte(a)
c := []rune(a)

(3) 运算

// 拼接
a := "hello"
b := "world"
c := a+b

// 获取字符串长度
len_ := len(a)
fmt.Println(len_)

// 遍历字节数组
for i:=0;i<len(c);i++{
	fmt.Println(c[i])
}

// 遍历rune数组
for i,v := range c{
	fmt.Println(i,v)
}

复合数据类型

指针

// *p和a的值都是11
var a int = 11
p := &a
fmt.Println(*p)

结构体指针

type User struct {
	name string
	age int
}
andes := User{
	name: "andes",
	age: 18,
}
p := &andes
// 通过.访问成员变量
fmt.Println(p.name)

数组

数组一般在创建时通过字面量初始化

a := [3]int{1,2,3}	// 指定长度和初始化字面量
b := [...]int{1,2,3}	// 不指定长度,但是由后面的初始化列表数量来确定其长度
c := [3]int{1:1,2:3}	// 指定总长度,并通过索引进行初始化,没有初始化元素时使用类型默认值
d := [...]int{1:1,2:3}	// 不指定总长度,通过索引值进行初始化,数值长度由最后一个索引值确定,没有指定索引的元素被初始化为类型的零值

数组的特点

(1) 数组创建完长度就固定了,不可以再追加元素;
(2) 数组是值类型的,数组赋值或作为函数参数都是值拷贝;
(3) 数组长度是数组类型的组成部分,[10]int和[20]int表示不同的类型;
(4) 可以根据数组创建切片

数组的相关操作
(1) 数组元素访问

a:=[...]int{1,2,3}
b:=a[0]
fmt.Println(b)
for i,v :=range a{
	fmt.Println(i, v)
}

(2) 数组长度

a:=[...]int{1,2,3}
alen := len(a)
for i:=0;i<alen;i++{
	fmt.Println(i, a[i])
}

切片

Golang数组的定长性和值拷贝限制了其使用场景
Golang提供了切片slice,这是一种变长数组,其数据结构中有指向数组的指针,所以是一种引用类型。

  • Golang为切片维护三个元素:
    指向底层数组的指针array
    切片的元素数量
    底层数组的容量

(1) 创建方法1: 由数组创建
语法:array[b:e]

array:=[...]int{0,1,2,3,4,5,6}
// array表示数组名;
// b表示开始索引,默认是0;
// e表示结束索引,默认是len(array)
s1:= array[:4]
s2:= array[1:]
s3:= array[1:3]
fmt.Println(s1)
fmt.Println(s2)
fmt.Println(s3)

(2) 创建方法2:通过内置函数make创建
注意:各元素被默认初始化为切片元素类型的零值

// len=10, cap=10
a:=make([]int, 10)
fmt.Println(a)
// len=10, cap=15
b:=make([]int, 10, 15)
fmt.Println(b)
  • 切片支持的操作
    (1) len() 返回切片的长度;
    (2) cap() 返回切片底层数组容量;
    (3) append() 对切片追加元素;
    (4) copy()复制一个切片;
a:=[...]int{0,1,2,3,4,5, 6}
b:=make([]int, 2, 4)
c:=a[0:3]

fmt.Println(len(b)) // 2
fmt.Println(cap(b)) // 4
b = append(b, 1)
fmt.Println(b) // [0 0 1]
fmt.Println(len(b))  // 3
fmt.Println(cap(b))  // 4

b = append(b, c...)
fmt.Println(b) // [0 0 1 0 1 2]
fmt.Println(len(b)) // 6
fmt.Println(cap(b)) // 8

d:=make([]int, 2, 2)
copy(d, c)
fmt.Println(d) // [0,1]
fmt.Println(len(d)) // 2
fmt.Println(cap(d)) // 2
  • 字符串和切片的相互转换
str:="hello world!" // 通过字符串字面量初始化一个字符串str
a:=[]byte(str)	// 将字符串转换为[]byte类型切片
b:=[]rune(str)	// 转换为[]rune类型切片

map

字典。格式:map[K]T,其中K可以是任意可以进行比较的类型,T是值类型。
map也是一种引用类型。

  • map的创建
    (1) 使用字面量创建
ma:=map[string]int{"a":1,"b":2}
fmt.Println(ma["a"])
fmt.Println(ma["b"])

(2) 使用内置make函数创建

make(map[K]T)	// map的容量使用默认值
make(map[K]T, len)	// map的容量使用给定的len值
mp1:=make(map[int]string)
mp2:=make(map[int]string, 10)

mp1[1] = "tom"
mp2[1] = "tony"

fmt.Println(mp1[1])
fmt.Println(mp2[1])
  • map支持的操作
    (1) 单个键访问mapName[key];
    (2) 使用range遍历,但是不保证每次迭代的元素顺序;
    (3) 使用delete删除键值;
    (4) len()返回map中的键值对数量。
mp := make(map[int]string)
mp[1] = "tom"
mp[2] = "pony"
mp[3] = "jack"
delete(mp, 3)

fmt.Println(mp[1])
fmt.Println(len(mp))

for k, v := range mp{
	fmt.Println("key=", k, "value=", v)
}

struct

结构由多个不同类型元素组合而成

  • 创建struct
    (1) struct类型字面量(较少使用)
struct {
	FieldName FieldType
	FieldName FieldType
	FieldName FieldType
}

(2) 自定义struct类型

type TypeName struct{
	FieldName FieldType
	FieldName FieldType
	FieldName FieldType
}

(3) struct类型变量的初始化

type Person struct {
	Name string
	Age int
}

type Student struct {
	*Person
	Num int
}

// 按照类型声明顺序, 逐个赋值(不推荐,一旦struct增加字段,则整个初始化语句会报错)
//a:=Person{"Tom", 21}

// 推荐使用field名字的初始化方式,没有指定的字段默认初始化为类型零值
p := &Person{
	Name : "Jack",
	Age: 22,
}

s := Student{
	Person: p,
	Num: 100,
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WUYANGEZRA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值