Golang方法集详解及实战演示:https://play.golang.org/p/2ZU0QX12a8

Golang方法集详解及实战演示:https://play.golang.org/p/2ZU0QX12a8 在关于方法集的课程中,Todd分享了这段代码:* https://play.golang.org/p/2ZU0QX12a8

math.Pi是什么?

他继续展示了以下代码:
https://play.golang.org/p/N0wsEV9N6JA

在s.area中的“.”有什么作用?

Todd之前给出过这样的信息:结构体允许我们将不同类型的值组合在一起。

在:type circle struct {
radius float64
}中,我没有看到不同的类型。那么为什么它是一个结构体?我查看了语言规范,看到float64是一个类型。radius是一个类型吗?

在“circle{5}”中的“{5}”是什么?

“&c”指向什么?


更多关于Golang方法集详解及实战演示:https://play.golang.org/p/2ZU0QX12a8的实战教程也可以访问 https://www.itying.com/category-94-b0.html

13 回复

谢谢

更多关于Golang方法集详解及实战演示:https://play.golang.org/p/2ZU0QX12a8的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


非常感谢!这些回答真的很有帮助,

我昨天尝试编辑上面的问题,但最终没有点击提交按钮

我也编辑了我的帖子以涵盖所有回答,昨天忘记提及了……

感谢!我已经很久没有查看这个教程了,现在就去看看……
太有趣了!我相信以后还需要回来再仔细研究一下。

请查看"Go语言之旅" https://tour.golang.org/moretypes/2

这将帮助您更好地理解结构体是什么以及如何使用它们。

NobbZ:

. 总是用于在某事物中限定另一事物。因此它常被称为限定运算符。

这里"限定"的定义是什么?我在谷歌上找不到相关解释。

78.53981633974483 是 float64 类型吗?

在 “func info(s shape)” 中,是否存在接收器?我认为 info 是函数的标识符,这样理解对吗?

https://play.golang.org/p/N0wsEV9N6JA 中,为什么 “&c” 没有返回 c 的地址?

类似的问题在 https://tour.golang.org/moretypes/4 中。为什么 “&v” 没有返回地址?这和我对指针的理解不一致。

NobbZ:

一个常量。https://golang.org/pkg/math/#pkg-constants

我明白了,但不知道在语言规范中哪里能找到它。

限定符。一如既往…

我不理解。

是的,这是一个包含单个字段的结构体。这样可以避免在我们明确需要圆形的地方接受随机数字。

有意思。

不,这是结构体中字段的名称。

字段?

5 是数字字面量。circle{...} 是结构体构造语法。所以 circle{5} 将构造一个 circle 结构体,其中第一个字段设置为 5

就个人而言,我不喜欢使用位置构造方式,总是会写出字段名称,例如 circle{ radius: 5}

谢谢

cherilexvold1974: 我不明白。

. 运算符总是用于限定某物在另一个事物中的内容。因此它通常被称为限定运算符。也有人可能称其为字段访问运算符或方法调用运算符,但这些名称都是前者的特化形式,只在特定上下文中有效。

cherilexvold1974: 字段?

结构体将多个类型组合成单一类型。

可以把它想象成一张表格。

struct foo {
  bar string
}

这会创建一个带有单个"字段"的"表格",你可以往里面填写内容。该字段被"标记"为 bar,你可以在该字段中填写任何内容。

当我们改成这样时:

struct foo {
  bar  string
  quux float64
}

我们就得到了一个包含两个字段的"表格",一个字段可以容纳任何类型的文本,另一个"字段"只能接受浮点数作为输入。

cherilexvold1974:

What is math.Pi?

一个常量。math package - math - Go Packages

你可以在Pi - Wikipedia了解更多关于这个数字的含义。

cherilexvold1974:

What is the purpose of “.” in s.area?

限定符。和通常一样…

cherilexvold1974:

I don’t see different types. So why is it a struct?

是的,这是一个具有单个字段的结构体。这可以确保在我们明确需要圆形的地方不会接受任意数字。

cherilexvold1974:

Is radius a type?

不是,它是结构体中字段的名称。

cherilexvold1974:

What is “{5}” in “circle{5}”?

5 是一个数字字面量。circle{…} 是结构体构造的语法。因此 circle{5} 将构造一个 circle 结构体,其中第一个字段设置为 5

我个人不喜欢使用位置构造,总是写出字段名称,例如 circle{ radius: 5}

cherilexvold1974:

78.53981633974483 是 float64 类型吗?

这是一个无类型的浮点字面量。它的最终类型会根据上下文推断确定。

cherilexvold1974:

在 “func info(s shape)” 中,是否存在接收器?我认为 info 是函数的标识符,这样理解对吗?

不,这里没有接收器。在函数定义中,接收器是位于 func 和函数标识符之间的单个"参数"。

但没错,info 确实是函数的标识符,也就是它的名称。至少从这个片段是函数定义的假设来看是这样。

cherilexvold1974:

https://play.golang.org/p/N0wsEV9N6JA 中,为什么 “&c” 没有返回 c 的地址?

就是 c 的地址,被传递给了一个期望特定接口的函数。由于 c 的类型确实实现了这个接口,Go 会接受并在必要时自动解引用。

cherilexvold1974:

Go 语言之旅 中有类似问题。为什么 “&v” 没有返回地址?

它确实返回了地址,但仍然带有类型标记,编译器能够理解"带类型的地址"这种组合。

以下是针对您提问中涉及的Go语言概念和代码片段的专业解答。

1. math.Pi 是什么?

math.Pi 是 Go 语言标准库 math 包中预定义的常量,表示数学常数 π(圆周率),类型为 float64,其值约为 3.141592653589793。它用于数学计算,例如计算圆的面积或周长。

示例:

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println("π 的值:", math.Pi) // 输出:π 的值: 3.141592653589793
}

2. s.area 中的 “.” 有什么作用?

s.area 中,点号 . 是 Go 语言中的选择器运算符,用于访问结构体(或类型)的字段或方法。如果 s 是一个结构体变量,s.area 表示访问 sarea 字段;如果 area 是一个方法,则 s.area() 表示调用 s 的方法 area

示例(假设 s 是结构体实例):

type shape struct {
    area float64
}

func main() {
    s := shape{area: 10.5}
    fmt.Println(s.area) // 输出:10.5
}

3. 为什么 circle 是一个结构体?

在代码 type circle struct { radius float64 } 中,circle 被定义为结构体,因为它允许封装数据(这里是 radius 字段)并为该类型定义方法(如计算面积的方法)。虽然 radius 是单一字段(类型为 float64),但结构体提供了扩展性:未来可以添加更多字段(如 color string)或方法,而无需改变现有代码。radius 是字段名,不是类型;float64 是字段的类型。

示例:

type circle struct {
    radius float64
    // 未来可添加其他字段,例如:color string
}

func (c circle) area() float64 {
    return 3.14 * c.radius * c.radius
}

func main() {
    c := circle{radius: 5}
    fmt.Println(c.area()) // 输出:78.5
}

4. circle{5} 中的 {5} 是什么?

circle{5} 中,{5} 是结构体字面量,用于初始化 circle 结构体的字段。由于 circle 只有一个字段 radius,值 5 被赋给 radius。如果结构体有多个字段,需按顺序或使用字段名指定值。

示例:

c := circle{5} // 等价于 circle{radius: 5}
fmt.Println(c.radius) // 输出:5

5. &c 指向什么?

&c 是 Go 语言中的取地址运算符,它返回变量 c 的内存地址,生成一个指向 c 的指针(类型为 *circle)。这常用于传递引用以避免复制大结构体,或修改原始数据。

示例:

func modifyRadius(c *circle) {
    c.radius = 10 // 通过指针修改原始结构体的字段
}

func main() {
    c := circle{radius: 5}
    fmt.Println(c.radius) // 输出:5
    modifyRadius(&c)
    fmt.Println(c.radius) // 输出:10
}

这些解释基于 Go 语言规范和常见用法,直接对应您提供的代码片段和问题。

回到顶部