Go新手需注意的知识点(二)

学习Go的一些需要注意的知识点。

七、数组

1、数组申明:var identifier [len]type ; arr := […]string{“aa”,”bb”,”cc”,”dd”}

2、使用for、for-range循环打印数组, for k,v := range arr {} ; for i := 0; i < len(arr); i++ {}

3、数组和切片的区别。参考:GO中数组与切片的区别

4、终止索引标识的项不包括在切片内

八、map

1、map的声明

  • var identifier map [keyType] valueType
  • var identifier = make(map [keyType] valueType)
  • identifier := make(map [keyType] valueType)

2、valueType的形式多样。出了string、int,还可以包括[4]int、[]int、func() int 、map [keyType] valueType等。

3、数组、切片、map,这三种类型中,map的性能是最低的,读取的性能比例大概是 1 : 1.5 : 25

4、注意:map 默认是无序的,不是按照 key 的顺序排列的,也不是按照 value 的序排列的。每次刷新后,排序会发生变化。

5、使用val1, isPresent = map1[key1] 方法,来判断key1是否存在?

6、map的排序、key和值互换的方法。

九、包

1、math/big,可以对大的整数进行运算,但性能极其低下。

2、参考:Go中import 导入包的语法

十、结构体 struct

1、结构体的定义的语法:

type identifier struct {
    field1 type1
    field2 type2
    ...
}

2、结构的声明两种方式:

第一种:
var t *T
t = new(T)
也可以直接写成: t := new(T)

第二种:
var t T

注意这2种的区别,第一种方式:变量 t 是一个指向 T的指针,此时结构体字段的值是它们所属类型的零值。
声明 var t T 也会给 t 分配内存,并零值化内存,但是这个时候 t 是类型T。在这两种方式中,t 通常被称做类型 T 的一个实例(instance)或对象(object)。

无论变量t是一个结构体类型还是一个结构体类型指针,都使用同样的 选择器符(selector-notation) 来引用结构体的字段:

type myStruct struct { i int }
var v myStruct    // v是结构体类型变量
var p *myStruct   // p是指向一个结构体类型变量的指针
v.i
p.i

 3、结构体初始化

type struct1 struct {
    i1  int
    f1  float32
    str string
}
  • ms := &struct1{10, 15.5, “Chris”}
  • ms := struct1{10, 15.5, “Chris”}

 4、结构体中的方法

参考:GO中结构体 struct 中的方法

十一、接口

1、接口定义格式

type Namer interface {
    Method1(param_list) return_type
    Method2(param_list) return_type
    ...
}

2、接口命名的方式

接口的名字由方法名加 [e]r 后缀组成,例如 Printer、Reader、Writer、Logger、Converter 等等。还有一些不常用的方式(当后缀 er 不合适时),比如 Recoverable,此时接口名以 able 结尾,或者以 I 开头(像 .NET 或 Java 中那样)。
Go 语言中的接口都很简短,通常它们会包含 0 个、最多 3 个方法。

3、接口类型的判断:type-switch

switch t := o.(type) {
    case *stockPostion:
        fmt.Printf("Type Square %T with value %v\n", t, t)
    case *car:
        fmt.Printf("Type Circle %T with value %v\n", t, t)
    case nil:
        fmt.Printf("nil value: nothing to check?\n")
    default:
        fmt.Printf("Unexpected type %T\n", t)
    }

4、在接口上调用方法时,必须有和方法定义时相同的接收者类型或者是可以从具体类型 P 直接可以辨识的:

  • 指针方法可以通过指针调用
  • 值方法可以通过值调用
  • 接收者是值的方法可以通过指针调用,因为指针会首先被解引用
  • 接收者是指针的方法不可以通过值调用,因为存储在接口中的值没有地址

将一个值赋值给一个接口时,编译器会确保所有可能的接口方法都可以在此值上被调用,因此不正确的赋值在编译期就会失败。

译注:Go 语言规范定义了接口方法集的调用规则:

  • 类型 *T 的可调用方法集包含接受者为 *T 或 T 的所有方法集
  • 类型 T 的可调用方法集包含接受者为 T 的所有方法
  • 类型 T 的可调用方法集不包含接受者为 *T 的方法

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>