Golang 学习入坑,四Go语言数组/切片/结构体/指针/Range(范围/interface(接口

(一)数组

//数组定义:var variable_name [SIZE] variable_type
var arr [10] int
//以上为一维数组的定义方式。例如以下定义了数组 arr 长度为 10 类型为int:
//初始化数组:
var b = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
//初始化数组中 {} 中的元素个数不能大于 [] 中的数字。如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小:
b := []float32{1000.0, 2.0, 3.4, 7.0, 50.0}

(二)切片

定义:Go 语言切片是对数组的抽象。
Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
//你可以声明一个未指定大小的数组来定义切片:
var identifier []type
使用make函数定义切片。或使用make()函数来创建切片:   
var slice1 []type = make([]type, len) 简写为:slice1 := make([]type, len)
其中len代表长度,cap代表最长多少  例如:make([]T, length, capacity)
// 创建一个整型切片其长度和容量都是 10 个元素
slice := make([]int, 10)
创建一个整型切片其长度为 3 个元素,容量为 5 个元素
slice := make([]int, 3, 5)
//下边这个函数可以打印切片
func printfslic(x [] int) {
  fmt.Printf("切片的长度为%d,最大为%d,slice为%v。。第二个参数为:%d\n",len(x),cap(x),x)
}
//其中nil切片/空切片。切片扩容。/切片赋值-限制切片容量
具体以后整理下:
现在看下这个自己打印下。https://www.cnblogs.com/sparkdev/p/10704614.html

(三)结构体

Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下:
type struct_variable_type struct {
   member definition
   member definition
   ...
   member definition
}
一旦定义了结构体类型,它就能用于变量的声明,语法格式如下
variable_name := structure_variable_type {value1, value2...valuen}
或
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}

例子:
package main

import "fmt"

type person struct{
    name string
    age int
    ismarry bool
}

func main() {
    tongtong := person{"张tongtong",25,false}
    fmt.Println(tongtong)
    tongtong1 := person{name:"张tongtong",age:27,ismarry:true}
    fmt.Println(tongtong1)
}

(四)指针

Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

package main
import "fmt"

func main() {
   a := 10
   fmt.Printf("变量的地址: %x\n", &a  )          //打印出来a变量的地址
}
什么是指针?一个指针变量指向了一个值的内存地址。类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下:
--在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。--
var var_name *var-type
func main() {
        //var ip *int        // 指向整型的空指针
        //var fp *float32    // 指向浮点型的空指针

        a := 10
        var ip *int                      //定义一个指针变量

        ip = &a                              //指向a的内存地址
        fmt.Printf("a 变量的地址是: %x\n", &a  )

    /* 指针变量的存储地址 */
    fmt.Printf("ip 变量储存的指针地址: %x\n", ip )

    /* 使用指针访问值 */
    fmt.Printf("*ip 变量的值: %d\n", *ip )
}
//结果为
a 变量的地址是: c000014078
ip 变量储存的指针地址: c000014078
*ip 变量的值: 10

(五)范围range

 

package main

import "fmt"

type person struct{
    name string
    age int
    ismarry bool
}

func main() {
    numSlice := []int{1,3,2,3}
    nums := 0
    for _,val := range numSlice {
        nums += val
    }
    fmt.Println("nums:", nums)
    //这个是index
    for i, num := range numSlice {
        if num == 3 {
            fmt.Println("index:", i)
        }
    }
    kvs := map[string]string{"a": "apple", "b": "banana"}
    for k, v := range kvs {
        fmt.Printf("%s -> %s\n", k, v)
    }
    //range也可以用来枚举Unicode字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。
    for i, c := range "go" {
        fmt.Println(i, c)
    }


}

(六)接口

1. 什么是interface接口

  interface 是GO语言的基础特性之一。可以理解为一种类型的规范或者约定。它跟java,C# 不太一样,不需要显示说明实现了某个接口,它没有继承或子类或“implements”关键字,只是通过约定的形式,隐式的实现interface 中的方法即可。因此,Golang 中的 interface 让编码更灵活、易扩展。

  如何理解go 语言中的interface ? 只需记住以下三点即可:

    1. interface 是方法声明的集合

    2. 任何类型的对象实现了在interface 接口中声明的全部方法,则表明该类型实现了该接口。

    3. interface 可以作为一种数据类型,实现了该接口的任何对象都可以给对应的接口类型变量赋值。

注意:

  a. interface 可以被任意对象实现,一个类型/对象也可以实现多个 interface

  b. 方法不能重载,如 eat() eat(s string) 不能同时存在

package main

import "fmt"

type Person interface {
        car()
}
type Women struct{}

func (women Women) car() {
        fmt.Println("女人开车")
}

type Man struct{}

func (man Man) car() {
        fmt.Println("男人开车")
}

func main() {
        var person Person
        person = new(Women)
        person.car()
        person = new(Man)
        person.car()
}