golang学习之struct

结构体定义的一般方式如下:

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

type T struct {a, b int} 也是合法的语法,它更适用于简单的结构体。

var t *T
t = new(T)

变量 t 是一个指向 T的指针,此时结构体字段的值是它们所属类型的零值,使用 new 函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针。

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

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

struct实例:

package main

import (
    "fmt"
    "strings"
)

type Person struct {
    firstName string
    lastName  string
}

func upPerson(p *Person) {
    p.firstName = strings.ToUpper(p.firstName)
    p.lastName = strings.ToUpper(p.lastName)
}

func main() {

    // 1-struct as a value type:
    var pers1 Person
    pers1.firstName = "Chris"
    pers1.lastName = "Woodward"
    upPerson(&pers1)
    fmt.Printf("The name of the person is %s %s\n", pers1.firstName, pers1.lastName)

    // 2—struct as a pointer:
    pers2 := new(Person)
    pers2.firstName = "Chris"
    pers2.lastName = "Woodward"
    (*pers2).lastName = "Woodward" // 这是合法的
    upPerson(pers2)
    fmt.Printf("The name of the person is %s %s\n", pers2.firstName, pers2.lastName)

    // 3—struct as a literal:
    pers3 := &Person{"Chris", "Woodward"}
    upPerson(pers3)
    fmt.Printf("The name of the person is %s %s\n", pers3.firstName, pers3.lastName)
}

程序输出:

The name of the person is CHRIS WOODWARD
The name of the person is CHRIS WOODWARD
The name of the person is CHRIS WOODWARD

使用反射访问struct的tag标签:

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    firstName string `An important answer`
    lastName  string `The name of the thing`
}

func main() {

    tt := Person{"first", "last"}
    for i := 0; i < 2; i++ {
        refTag(tt, i)
    }
}

程序输出:

Tag:An important answer    Name:firstName
Tag:The name of the thing    Name:lastName

在值和指针上调用方法:

可以有连接到类型的方法,也可以有连接到类型指针的方法。

但是这没关系:对于类型 T,如果在 *T 上存在方法 Meth(),并且 t 是这个类型的变量,那么 t.Meth() 会被自动转换为(&t).Meth()

指针方法和值方法都可以在指针或非指针上被调用,收者类型是 *TwoInts 的方法 AddThem(),它能在类型 TwoInts 的值上被调用,这是自动间接发生的。

因此 two2.AddThem 可以替代 (&two2).AddThem()

再说一句,go中有方法继承与覆盖,不过必须是匿名字段o

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

LeetCode 19. Remove Nth Node From End of List题目分析代码

样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null.

544
来自专栏尾尾部落

[LeetCode]Merge Two Sorted Lists 合并两个排好序的链表 [LeetCode]Merge Two Sorted Lists 合并两个排好序的链表

链接:https://leetcode.com/problems/merge-two-sorted-lists/#/description 难度:Easy...

832
来自专栏赵俊的Java专栏

丑数II

1192
来自专栏Google Dart

Dart 中构造函数定义与使用详解 原

在这种没有构造函数的情况下Dart会为其隐式定义一个默认构造函数(与类名相同、无参数)

782
来自专栏赵俊的Java专栏

两两交换链表中的节点

1824
来自专栏null的专栏

LeetCode——Add Two Numbers

题目: You are given two linked lists representing two non-negative numbers. The di...

3245
来自专栏计算机视觉与深度学习基础

Leetcode 82 Remove Duplicates from Sorted List II

Given a sorted linked list, delete all nodes that have duplicate numbers, leavi...

1755
来自专栏计算机视觉与深度学习基础

Leetcode 142 Linked List Cycle II

Given a linked list, return the node where the cycle begins. If there is no cyc...

1769
来自专栏Java学习网

问题系列之Java中删除有序List的重复数据——提供两种方法

Java学习网(www.javalearns.com)提拱 现在给出一个有序的List,删除其中重复的元素,要求第个元素只能出现一次,并且是经过的排序的; ...

2168
来自专栏尾尾部落

[剑指offer] 链表中环的入口结点

假设环长度为n,进入环之前结点个数为x,slow在环内走了k个结点,fast绕环走了m圈,则有2(x+k)=x+mn+k 可以得出x = mn - k。此时sl...

593

扫码关注云+社区