go学习文档-结构(struct)--方法(method)

2018-06-27  本文已影响0人  R_X

一、结构

1、实例化

--使用new (得到的是指针类型)

使用 new 函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针:var t *T = new(T)

type struct1 struct {
    i1  int
    f1  float32
    str string
}
var stru *struct1 = new(struct1)

--对象字面量方式 (得到的是值类型)

type Interval struct {
    start int
    end   int
}

intr1 := Interval{0, 3}            // __(得到的是值类型)__
intr2 := Interval{end:5, start:1}  // __(得到的是值类型)__
intr3 := &Interval{end:5}           // __(得到的是指针类型)__

表达式 new(Type) 和 &Type{} 是等价的,得到的都是指针。

切记,不要用make关键字,会引发编译错误

2、指针类型的实例赋值

 pers2 := new(Person)
 pers2.lastName = "Woodward"
 (*pers2).lastName = "Woodward"  // 这也是合法的

3、匿名(或内嵌)字段

匿名字段:字段可以没有名字,但是类型是必须的,此时类型就是字段的名字。
匿名字段本身可以是一个 结构体。

type struct01 struct { a,b int }
type struct02 struct { 
  struct01   // 内嵌结构体
  a int // 重载 struct01 中的 a 字段
  int  // 匿名字段,以类型 作为 名字
}
# 实例化:
str02 := new struct02()
str02.struct01.a = 123
str02.a = 1
str02.int = 2   //  给匿名字段赋值
str02.b = 3

二、方法

# 定义格式:
func (recv receiver_type) methodName(parameter_list) (return_value_list) { ... }

# 例子:
type struct01 struct { a, b int }   // 定义一个 结构体
// 以该结构体作为接受者,定义一个方法 sum 
func (stru01 *struct01) sum() int {
  // stru01 相当于 this 的意思
  return stru01.a + stru01.b
}

func (_ *struct01) saySth() {
  fmt.Println('这个方法不使用到结构体struct01中的任何字段,所以 接受者的实例可以用 _ 来替代')
}

定义在 上的方法,既可以通过调用,也可以通过指针调用,因为指针会解引用;
定义在指针上的方法,只能通过指针调用,不能通过值调用。

三、结构体的遍历

package main
import (
    "fmt"
    "reflect"
)
type person struct {
    name string
    age  int
}
func main() {
    v := reflect.ValueOf(person{"Diana", 30})
    count := v.NumField()
    for i := 0; i < count; i++ {
        f := v.Field(i)
        switch f.Kind() {
        case reflect.String:
            fmt.Println(f.String())
        case reflect.Int:
            fmt.Println(f.Int())
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读