Go语言快速上手 - 基础语言(2)|青训营

65 阅读3分钟

引言

继续上文,继续补充

变化

数组与切片(slice):

1.数组:(固定长度)

(1)定义:

var myArray1 [10]int
myArray2 := [10]int{1,2,3,4}

(2)可以利用循环查看数组:

for index, value := range myArray2{ //range为迭代语法,语言范围
  fmt.Println("index =", index, "value =", value)
}

(3)固定长度的数组在传参的时候是严格匹配数组类型的

2.切片:(动态长度,实际上类似于指针)

(1)定义(4种方式)

/*1*/slice := []int{1,2,3,4}            //声明slice是一个切片,并且初始化,默认值是1,2,3。长度len是3/*2*/var slice1 []int                   //声明slice1是一个切片,但是并没有给slice分配空间,如果不用make开辟空间则会报错
     slice1 = make([]int,3)
​
/*3*/var slice2 []int = make([]int,3)   //声明slice2是一个切片,同时给slice分配空间,3个空间,初始化值为0
/*4*/slice2 := make([]int,3)            //通过:=推导出slice2是一个切片

带容量的定义:

var slice1 = make([]int, 3, 5)

(2)slice切片追加与截取(cap):

利用append来增加切片中的值(当append申请超过cap容量的值时,会自动再开辟与之前相同cap的数值,也就是cap自动x2【之前的cap为5的话,超过之后的cap就为10】)

var numbers = make([]int, 3, 5)
numbers = append(numbers, 1)

对copy以及复制更细节的解释:www.jb51.net/article/264…

copy可以复制另一个切片的值到选择的切片中替换位置上的值

区别

1.数组是固定长度,而切片更加灵活

(1)可以增加长度:

s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("len:", len(s)) //3
fmt.Println(s) //[a b c]
s = append(s, "d") //append增加元素
fmt.Println(s) //[a b c d]

(2)可以复制其他切片

(注意,如果make数组一开始设置的长度是不等于复制数组的长度,会导致只复制那么多长度的数值)

c := make([]string, len(s))
copy(c,s)
fmt.Println(c)[a b c d] //如果将make的长度设置为

2.用make做切片

切片是指:www.php.cn/faq/499329.…

new与make的区别:www.jianshu.com/p/d2e4b3ec8…

3.切片实际上类似于指针,直接指向内存地址,引用传递;而数组只是值拷贝。当引入函数中时,切片无论在哪都会直接会改变数值,数组则只是复制数值进入函数,当在函数中改变形参的值实质上并没有改变传入的数组

Map

类似于哈希、KeyValue形式,有点像字典

1.定义:

func main(){
  var myMap1 map[string]
}

2.声明方式(三种)

(1)第一种声明方式:声明my Map是一种map类型,key是string,value是string

var myMap1 map[string]string
if myMap1 == nil{
  fmt.Println("myMap1是一个空map")
}
//在使用map之前还是需要用make给map分配数据空间
myMap1 = make(map[string]string, 10)
myMap1["one"] = "java"
myMap1["two"] = "C++"
myMap1["three"] = "python"
fmt.Println(myMap1)

(2)第二种声明方式:切记先make开辟空间

myMap2 := make(map[int]string)
myMap2[1] = "java"
myMap2[2] = "C++"
myMap2[3] = "python"
fmt.Println(myMap2)

(3)第三种声明方式(常用):利用冒号,并且要在每一行的后面加上逗号。初始化后自动开辟空间

myMap3 := map[string]string{
  "one": "php",
  "two": "C++",
  "three": "python",
}

3.应用:

func main(){
  cityMap := make(map[string]string)
  //加入数据
  cityMap["China"] = "Beijing"
  cityMap["Japan"] = "Tokyo"
  cityMap["USA"] = "NewYork"
}

(1)遍历

for key, value := range cityMap {
  fmt.Printf("key =%v ", key)
  fmt.Println("value =",value)
}

(2)删除

delete(cityMap, "China")

(3)修改

cityMap["USA"] = "DC"

(4)引用传递

func ChangeValue(cityMap map[string]string) {
  cityMap["US"] = "London"
}

Print

Print分为三种,Print、Printf、Println,日常使用为Printf与Println

Println自动带换行,如果有字符串,则值自动跟在字符串的后面

Printf不换行,需要插入占位符:blog.csdn.net/weixin_4212…