数组

1.数组

01.切片基础

1.1 Array介绍

  • 数组是指一系列同一类型数据的集合
  • 数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如 int、string 等
  • 一个数组包含的元素个数被称为数组的长度。
  • 在 Golang 中数组是一个长度固定的数据类型,数组的长度是类型的一部分,也就是说 [5]int 和 [10]int 是两个不同的类型
  • Golang中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速度非常快。
  • 和数组对应的类型是 Slice(切片),Slice 是可以增长和收缩的动态序列,功能也更灵活
  • 但是想要理解 slice 工作原理的话需要先理解数组,所以本节主要为大家讲解数组的使用。

img

1.2 数组定义

1
var 数组变量名 [元素数量]T
  • 比如:var a [5]int, 数组的长度必须是常量,并且长度是数组类型的一部分
  • 一旦定义,长度不能变。 [5]int 和[4]int 是不同的类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
package main
import "fmt"
func main() {
// 定义一个长度为 3 元素类型为 int 的数组 a
var a [5]int
// 定义一个长度为 3 元素类型为 int 的数组 b 并赋值
var b [3]int
b[0] = 80
b[1] = 100
b[2] = 96
fmt.Println(a) // [0 0 0 0 0]
fmt.Print(b) // [80 100 96]
}

1.3 数组是值类型

  • 数组是值类型,赋值和传参会复制整个数组。
  • 因此改变副本的值,不会改变本身的值。
  • 注意:
    • 数组支持 “==“、”!=” 操作符,因为内存总是被初始化过的。
    • [n]*T表示指针数组,*[n]T 表示数组指针
1
2
3
4
5
6
7
8
9
10
package main
import "fmt"
func main() {
a := [3]int{10, 20, 30}
modifyArray(a) //在 modify 中修改的是 a 的副本 x
fmt.Println(a) //[10 20 30]
}
func modifyArray(x [3]int) {
x[0] = 100
}

02.创建数组

2.1 自定义数组长度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
import "fmt"
func main() {
// 1) 数组会初始化为 int 类型的零值
var testArray [3]int
fmt.Println(testArray) //[0 0 0]

// 2) 使用指定的初始值完成初始化
var numArray = [3]int{1, 2}
fmt.Println(numArray) //[1 2 0]

var cityArray = [3]string{"北京", "上海", "深圳"}
fmt.Println(cityArray) //[北京 上海 深圳]
}

2.2 让编译器识别

  • 按照上面的方法每次都要确保提供的初始值和数组长度一致
  • 一般情况下我们可以让编译器根据初始值的个数自行推断数组的长度
1
2
3
4
5
6
7
8
9
10
11
package main
import "fmt"
func main() {
var numArray = [...]int{1, 2}
fmt.Println(numArray) //[1 2]
fmt.Printf("type of numArray:%T\n", numArray) //type of numArray:[2]int

var cityArray = [...]string{"北京", "上海", "深圳"}
fmt.Println(cityArray) //[北京 上海 深圳]
fmt.Printf("type of cityArray:%T\n", cityArray) //type of cityArray:[3]string
}

2.3 指定索引值

  • 我们还可以使用指定索引值的方式来初始化数组
1
2
3
4
5
6
7
8
package main
import "fmt"
func main() {
// 初始化一个整数数组,在下标1号和3号位置写入: 1 5
a := [...]int{1: 1, 3: 5}
fmt.Println(a) // [0 1 0 5]
fmt.Printf("type of a:%T\n", a) //type of a:[4]int
}

03.数组的遍历

3.1 普通遍历数组

1
2
3
4
5
6
7
8
9
10
11
12
13
package main
import "fmt"
func main() {
var a = [...]string{"北京", "上海", "深圳"}
for i := 0; i < len(a); i++ {
fmt.Println(a[i])
}
}
/*
北京
上海
深圳
*/

3.2 k,v遍历数组

1
2
3
4
5
6
7
8
9
10
11
12
13
package main
import "fmt"
func main() {
var a = [...]string{"北京", "上海", "深圳"}
for index, value := range a {
fmt.Println(index, value)
}
}
/*
0 北京
1 上海
2 深圳
*/

04.多维数组

4.1 定义多维数组

1
2
3
4
5
6
7
8
9
10
11
package main
import "fmt"
func main() {
a := [3][2]string{
{"北京", "上海"},
{"广州", "深圳"},
{"成都", "重庆"},
}
fmt.Println(a) //[[北京 上海] [广州 深圳] [成都 重庆]]
fmt.Println(a[2][1]) //支持索引取值:重庆
}

4.2 遍历多维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
import "fmt"
func main() {
a := [3][2]string{
{"北京", "上海"},
{"广州", "深圳"},
{"成都", "重庆"},
}
for _, v1 := range a { // v1 = [北京 上海]
for _, v2 := range v1 {
fmt.Println(v2)
}
}
}
/*
北京
上海
广州
深圳
成都
重庆
*/

05.数组练习

5.1 数组求和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
import "fmt"
func main() {
var intArr2 [5]int = [...]int {1, -1, 9, 90, 12}
sum := 0
for _, val := range intArr2 {
//累计求和
sum += val
}

//如何让平均值保留到小数.
fmt.Printf("sum=%v 平均值=%v \n\n", sum, float64(sum) / float64(len(intArr2)))
// sum=111 平均值=22.2
}

5.2 数组最大值

  • 1、声明一个数组 var intArr[5] = […]int {1, -1, 12, 65, 11}
  • 2、假定第一个元素就是最大值,下标就 0
  • 3、然后从第二个元素开始循环比较,如果发现有更大,则交换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import "fmt"
func main() {
var intArr = [...]int{1, -1, 112, 65, 11}
maxValue := intArr[0]
maxIndex := 0
for i := 0; i < len(intArr); i++ {
if maxValue < intArr[i] {
maxValue = intArr[i]
maxIndex = i
}
}
fmt.Println("最大值", maxValue, "最大值索引值", maxIndex)
// 最大值 112 最大值索引值 2
}

基本数据类型

1.基本数据类型

01.内置类型

1.1 值类型:

1
2
3
4
5
6
7
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
float32, float64
string
complex64, complex128
array // 固定长度的数组

1.2 引用类型:(指针类型)

1
2
3
slice    // 序列数组(最常用)
map // 映射
chan // 管道

02.内置函数

  • Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。
  • 它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用于系统级的操作,例如:panic。
  • 因此,它们需要直接获得编译器的支持。
1
2
3
4
5
6
7
8
9
10
11
12
13
append          // 用来追加元素到数组、slice中,返回修改后的数组、slice
close // 主要用来关闭channel
delete // 从map中删除key对应的value
panic // 停止常规的goroutine (panic和recover:用来做错误处理)
recover // 允许程序定义goroutine的panic动作
real // 返回complex的实部 (complex、real imag:用于创建和操作复数)
imag // 返回complex的虚部
make // 用来分配内存,返回Type本身(只能应用于slice, map, channel)
new // 用来分配内存,主要用来分配值类型,比如int、struct。返回指向Type的指针
cap // capacity是容量的意思,用于返回某个类型的最大容量(只能用于切片和 map)
copy // 用于复制和连接slice,返回复制的数目
len // 来求长度,比如string、array、slice、map、channel ,返回长度
printprintln // 底层打印函数,在部署环境中建议使用 fmt 包

03.基本类型介绍

类型长度(字节)默认值说明
bool1false
byte10uint8
rune40Unicode Code Point, int32
int, uint4或8032 或 64 位
int8, uint810-128 ~ 127, 0 ~ 255,byte是uint8 的别名
int16, uint1620-32768 ~ 32767, 0 ~ 65535
int32, uint3240-21亿~ 21亿, 0 ~ 42亿,rune是int32 的别名
int64, uint6480
float3240.0
float6480.0
complex648xxxxxxxxxx package mainimport “fmt”func main() { var intArr = […]int{1, -1, 112, 65, 11} maxValue := intArr[0] maxIndex := 0 for i := 0; i < len(intArr); i++ { if maxValue < intArr[i] { maxValue = intArr[i] maxIndex = i } } fmt.Println(“最大值”, maxValue, “最大值索引值”, maxIndex) // 最大值 112 最大值索引值 2}go
complex12816
uintptr4或8以存储指针的 uint32 或 uint64 整数
array值类型
struct值类型
string“”UTF-8 字符串
slicenil引用类型
mapnil引用类型
channelnil引用类型
interfacenil接口
functionnil函数

04.数字类型

4.1 Golang数据类型介绍

  • Go 语言中数据类型分为:基本数据类型和复合数据类型
  • 基本数据类型有:
    • 整型、浮点型、布尔型、字符串
  • 复合数据类型有:
    • 数组、切片、结构体、函数、map、通道(channel)、接口

4.2 整型分为两大类

  • 有符号整形按长度分为:int8、int16、int32、int64
  • 对应的无符号整型:uint8、uint16、uint32、uint64

img

  • 关于字节:
    • 字节也叫 Byte,是计算机数据的基本存储单位。8bit(位)=1Byte(字节) 1024Byte(字节)=1KB
    • 1024KB=1MB 1024MB=1GB
    • 1024GB=1TB 。在电脑里一个中文字是占两个字节的。

4.3 unsafe.Sizeof

  • unsafe.Sizeof(n1) 是 unsafe 包的一个函数,可以返回 n1 变量占用的字节数
1
2
3
4
5
6
7
8
9
10
package main
import (
"fmt"
"unsafe"
)
func main() {
var a int8 = 124
fmt.Printf("%T\n", a) // int8
fmt.Println(unsafe.Sizeof(a)) // 1 (表示占用1个字节,也就是8 byte)
}

4.4 int不同长度直接的转换

1
2
3
4
5
6
7
8
9
10
package main
import (
"fmt"
)
func main() {
var num1 int8
num1 = 127
num2 := int32(num1) // 将num1类型转换成 int32 并赋值给num1
fmt.Printf("值:%v 类型%T", num2, num2) //值:127 类型 int32
}

4.5 浮点型

  • Go 语言支持两种浮点型数:float32 和 float64
1
2
3
4
5
6
7
8
9
package main
import (
"fmt"
"math"
)
func main() {
fmt.Printf("%f\n", math.Pi) // 3.141593 (默认保留 6 位小数)
fmt.Printf("%.2f\n", math.Pi) // 3.14 (保留 2 位小数)
}

4.6 reflect.TypeOf查看数据类型

1
2
3
4
5
6
7
8
9
10
package main
import (
"fmt"
"reflect"
)

func main() {
c := 10
fmt.Println( reflect.TypeOf(c) ) // int
}

4.7 int常用转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"fmt"
"strconv"
)

func main() {
// string到int
intV,_ := strconv.Atoi("123456")
// string到int64
int64V, _ := strconv.ParseInt("123456", 10, 64)

// int到string
strS := strconv.Itoa(123)
// int64到string
var tmp int64 = 123
str64S:=strconv.FormatInt(tmp,10)

fmt.Printf("%T--%T--%T--%T", intV, int64V, strS, str64S)
// int--int64--string--string
}

4.8 int8转int16

1
2
3
4
5
6
7
8
package main
import "fmt"
func main() {
var a int8 = 20
var b int16 = 40
var c = int16(a) + b //要转换成相同类型才能运行
fmt.Printf("值:%v--类型%T", c, c) //值:60--类型 int16
}

4.9 int16转float32

1
2
3
4
5
6
7
8
package main
import "fmt"
func main() {
var a float32 = 3.2
var b int16 = 6
var c = a + float32(b)
fmt.Printf("值:%v--类型%T", c, c) //值:9.2--类型 float32
}

4.10 math.Sqrt强转

1
2
3
4
5
6
7
8
9
10
11
12
package main
import (
"fmt"
"math"
)
func main() {
var a, b = 3, 4
var c int
// math.Sqrt()接收的参数是 float64 类型,需要强制转换
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c) // 5
}

4.11 int与str转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main
import (
"fmt"
"strconv"
)

func main() {
//2.1 int64转str
var num2 int64 = 123456
str2 := strconv.FormatInt(num2, 10)
fmt.Printf("%v---%T \n",str2,str2) // 123456---string

//2.2 str转int64
v1, _ := strconv.ParseFloat(str2, 64)
fmt.Printf("%v---%T\n",v1,v1) // 123456---float64
}

4.12 str与int64转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main
import (
"fmt"
"strconv"
)

func main() {
//1.1 int转sting
num1 := 123456
str1 := strconv.Itoa(num1)
fmt.Printf("%v---%T \n",str1,str1) // 123456---string

// 1.2 sting转int
_int, err := strconv.Atoi(str1)
fmt.Println(_int,err) // 123456 <nil>
fmt.Printf("%v---%T\n",_int,_int) // 123456---int


//2.1 int64转str
var num2 int64 = 123456
str2 := strconv.FormatInt(num2, 10)
fmt.Printf("%v---%T \n",str2,str2) // 123456---string

//2.2 str转int64
v1, _ := strconv.ParseFloat(str2, 64)
fmt.Printf("%v---%T\n",v1,v1) // 123456---float64
}

05.布尔值

  • Go 语言中以 bool 类型进行声明布尔型数据,布尔型数据只有 true(真)和 false(假)两个值。
  • 注意:
    • 1.布尔类型变量的默认值为 false。
    • 2.Go 语言中不允许将整型强制转换为布尔型.
    • 3.布尔型无法参与数值运算,也无法与其他类型进行转换。
1
2
3
4
5
6
7
8
9
package main
import (
"fmt"
"unsafe"
)
func main() {
var b = true
fmt.Println(b, "占用字节:", unsafe.Sizeof(b)) // true 占用字节: 1
}

06.字符串

6.1 字符串

  • Go 语言里的字符串的内部实现使用 UTF-8 编码。
  • 字符串的值为双引号(“)中的内容,可以在 Go 语言的源码中直接添加非 ASCII 码字符
1
2
s1 := "hello"
s2 := "你好"

6.2 字符串转义符

  • Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等

img

1
2
3
4
5
6
7
package main
import (
"fmt"
)
func main() {
fmt.Println("str := \"c:\\Code\\demo\\go.exe\"") // str := "c:\Code\demo\go.exe"
}

6.3 多行字符串

  • 反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。
1
2
3
4
5
6
7
8
9
10
11
package main
import (
"fmt"
)
func main() {
s1 := `
第一行
第二行
第三行`
fmt.Println(s1)
}

6.4 byte和rune

  • Go 语言的字符有以下两种
1
2
uint8类型,或者叫 byte 型:代表了ASCII码的一个字符。
rune类型:代表一个 UTF-8字符
  • 字符串底层是一个byte数组,所以可以和[]byte类型相互转换。
  • 字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。
  • rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。
1
2
3
4
5
6
7
8
9
package main
import "fmt"

func main() {
// “美国第一”
s := "美国第一"
s_rune := []rune(s)
fmt.Println( "中国" + string(s_rune[2:])) // 中国第一
}

07.字符串的常用操作

方法介绍
len(str)求长度
+或fmt.Sprintf拼接字符串
strings.Split分割
strings.Contains判断是否包含
strings.HasPrefix,strings.HasSuffix前缀/后缀判断
strings.Index(),strings.LastIndex()子串出现的位置
strings.Join(a[]string, sep string)join操作

7.1 len(str)

1
2
3
4
5
6
7
8
package main
import (
"fmt"
)
func main() {
var str = "this is str"
fmt.Println(len(str)) // 11
}

7.2 +(拼接)

1
2
3
4
5
6
7
8
9
package main
import (
"fmt"
)
func main() {
var str1 = "你好"
var str2 = "golang"
fmt.Println(str1 + str2) // 你好golang
}

7.3 strings.Split()

1
2
3
4
5
6
7
8
9
10
package main
import (
"fmt"
"strings"
)
func main() {
var s = "123-456-789"
var arr = strings.Split(s, "-")
fmt.Println(arr) // [123 456 789]
}

7.4 strings.HasPrefix()

  • 首字符尾字母包含指定字符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import (
"fmt"
"strings"
)
func main() {
// 1.判断字符串 以 this 开头
var str = "this is golang"
var flag = strings.HasPrefix(str, "this")
fmt.Println(flag) // true

// 2.判断字符串以 go 结尾
var flag2 = strings.HasSuffix(str, "go")
fmt.Println(flag2) // false
}

7.5 strings.Index()

  • 判断字符串出现的位置
1
2
3
4
5
6
7
8
9
10
package main
import (
"fmt"
"strings"
)
func main() {
var str = "this is golang"
var index = strings.Index(str, "go") //从前往后
fmt.Println(index) // 8 (判断字符串 go 出现的位置)
}

7.6 strings.Join()

1
2
3
4
5
6
7
8
9
10
11
12
package main
import (
"fmt"
"strings"
)
func main() {
var str = "123-456-789"
var arr = strings.Split(str, "-") // [123 456 789]
var str2 = strings.Join(arr, "*") // 123*456*789
fmt.Println(arr)
fmt.Println(str2)
}

7.7 单引号

  • 组成每个字符串的元素叫做“字符”,可以通过遍历字符串元素获得字符,字符用单引号(’)
  • uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符
  • rune 类型,代表一个 UTF-8 字符
1
2
3
4
5
6
7
8
9
10
11
package main
import "fmt"
func main() {
a := 'a'
name := "zhangsan"
//当我们直接输出 byte(字符)的时候输出的是这个字符对应的码值
fmt.Println(a) // 97 这里输出的是 a 字符串的 ASCII值
fmt.Println(name) // zhangsan
//如果我们要输出这个字符,需要格式化输出
fmt.Printf("的值是%c", a) // a的值是a
}

08.字符串遍历

8.1 遍历字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main
import "fmt"
func main() {
s := "hello 张三"
for i := 0; i < len(s); i++ { //byte
fmt.Printf("%v(%c) ", s[i], s[i])
// 104(h) 101(e) 108(l) 108(l) 111(o) 32( ) 229(å) 188(¼) 160() 228(ä) 184(¸) 137()
}

fmt.Println() // 打印一个换行

for _, r := range s { //rune
fmt.Printf("%v=>%c ", r, r)
// 104=>h 101=>e 108=>l 108=>l 111=>o 32=> 24352=>张 19977=>三
}
fmt.Println()
}

8.2 修改字符串

  • 要修改字符串,需要先将其转换成[]rune 或[]byte,完成后再转换为 string。
  • 无论哪种转换,都会重新分配内存,并复制字节数组。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
import "fmt"
func main() {
s1 := "big"
// 强制类型转换
byteS1 := []byte(s1)
byteS1[0] = 'p'
fmt.Println(string(byteS1)) // pig

s2 := "白萝卜"
runeS2 := []rune(s2)
runeS2[0] = '红'
fmt.Println(string(runeS2)) // 红萝卜
}
  • 将“美国第一”改成“中国第一”
1
2
3
4
5
6
7
8
9
package main
import "fmt"

func main() {
// “美国第一”
s := "美国第一"
s_rune := []rune(s)
fmt.Println( "中国" + string(s_rune[2:])) // 中国第一
}

09.转String

9.1 sprintf转string

  • 注意:sprintf 使用中需要注意转换的格式
    • int 为%d
    • float 为%f
    • bool 为%t
    • byte 为%c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main
import "fmt"
func main() {
var i int = 20
var f float64 = 12.456
var t bool = true
var b byte = 'a'
var strs string

strs = fmt.Sprintf("%d", i) // 把 int 转换成 string
fmt.Printf("类型: %T ,值=%v \n", strs, strs) // 类型: string ,值=20

strs = fmt.Sprintf("%f", f) // 把 float 转换成 string
fmt.Printf("类型: %T ,值=%v \n", strs, strs) // 类型: string ,值=12.456000

strs = fmt.Sprintf("%t", t) // 把 bool 转换成 string
fmt.Printf("类型: %T ,值=%v \n", strs, strs) // 类型: string ,值=true

strs = fmt.Sprintf("%c", b) // 把 byte 转换成 string
fmt.Printf("类型: %T ,值=%v \n", strs, strs) // 类型: string ,值=a
}

9.2 strconv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main
import (
"fmt"
"strconv"
)
func main() {
//1、int 转换成 string
var num1 int = 20
s1 := strconv.Itoa(num1)
fmt.Printf("类型: %T ,值=%v \n", s1, s1) // 类型: string ,值=20

// 2、float 转 string
var num2 float64 = 20.113123
/* 参数 1:要转换的值
参数 2:格式化类型
参数 3: 保留的小数点 -1(不对小数点格式化)
参数 4:格式化的类型
*/
s2 := strconv.FormatFloat(num2, 'f', 2, 64)
fmt.Printf("类型: %T ,值=%v \n", s2, s2) // 类型: string ,值=20.11

// 3、bool 转 string
s3 := strconv.FormatBool(true)
fmt.Printf("类型: %T ,值=%v \n", s3, s3) // 类型: string ,值=20.11

//4、int64 转 string
var num3 int64 = 20
s4 := strconv.FormatInt(num3, 10) /* 第二个参数10为 进制 */
fmt.Printf("类型 %T ,值=%v \n", s4, s4) // 类型 string ,值=20
}

10.String转其他

10.1 string转int

1
2
3
4
5
6
7
8
9
10
package main
import (
"fmt"
"strconv"
)
func main() {
var s = "1234"
i64, _ := strconv.ParseInt(s, 10, 64)
fmt.Printf("值:%v 类型:%T", i64, i64) // 值:1234 类型:int64
}

10.2 string转float

1
2
3
4
5
6
7
8
9
10
11
12
package main
import (
"fmt"
"strconv"
)
func main() {
str := "3.1415926535"
v1, _ := strconv.ParseFloat(str, 32)
v2, _ := strconv.ParseFloat(str, 64)
fmt.Printf("值:%v 类型:%T\n", v1, v1) // 值:3.1415927410125732 类型:float64
fmt.Printf("值:%v 类型:%T", v2, v2) // 值:3.1415926535 类型:float64
}

10.3 string转bool

1
2
3
4
5
6
7
8
9
package main
import (
"fmt"
"strconv"
)
func main() {
b, _ := strconv.ParseBool("true") // string 转 bool
fmt.Printf("值:%v 类型:%T", b, b) // 值:true 类型:bool
}

10.4 string转字符

1
2
3
4
5
6
7
8
9
10
11
12
package main
import (
"fmt"
)
func main() {
s := "hello 张三"
for _, r := range s { //rune
// 104(h) 101(e) 108(l) 108(l) 111(o) 32( ) 24352(张) 19977(三)
fmt.Printf("%v(%c) ", r, r)
}
fmt.Println()
}

10.5 字符串反转

1
2
3
4
5
6
7
8
9
10
11
12
13
package main
func Reverse(s string) string {
r := []rune(s)
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
func main() {
a := "Hello, Wrold"
println(a)
println(Reverse(a)) // dlorW ,olleH
}