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
谢谢
更多关于Golang方法集详解及实战演示:https://play.golang.org/p/2ZU0QX12a8的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
非常感谢!这些回答真的很有帮助,
我也编辑了我的帖子以涵盖所有回答,昨天忘记提及了……
感谢!我已经很久没有查看这个教程了,现在就去看看……
太有趣了!我相信以后还需要回来再仔细研究一下。
请查看"Go语言之旅" https://tour.golang.org/moretypes/2
这将帮助您更好地理解结构体是什么以及如何使用它们。
78.53981633974483 是 float64 类型吗?
在 “func info(s shape)” 中,是否存在接收器?我认为 info 是函数的标识符,这样理解对吗?
在 https://play.golang.org/p/N0wsEV9N6JA 中,为什么 “&c” 没有返回 c 的地址?
类似的问题在 https://tour.golang.org/moretypes/4 中。为什么 “&v” 没有返回地址?这和我对指针的理解不一致。
NobbZ:
我明白了,但不知道在语言规范中哪里能找到它。
限定符。一如既往…
我不理解。
是的,这是一个包含单个字段的结构体。这样可以避免在我们明确需要圆形的地方接受随机数字。
有意思。
不,这是结构体中字段的名称。
字段?
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 表示访问 s 的 area 字段;如果 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 语言规范和常见用法,直接对应您提供的代码片段和问题。


