freeCodeCamp/guide/chinese/go/go-structs/index.md

120 lines
3.2 KiB
Markdown
Raw Normal View History

---
title: Go Structs
localeTitle: 去结构
---
## 去结构
在Go中结构用于存储数据和相关功能。一个示例可能是表示用户的结构
```go
type User struct {
FirstName string
LastName string
Email string
Age int
}
```
在这里,我们可以存储用户的名字,姓氏,电子邮件地址和年龄。该属性的名称后跟我们要存储的数据类型。例如, `FirstName`属性是一个`string`而`Age`属性是一个`int` 。
### 创建对象
要初始化一个新对象我们可以使用Go简写语法来创建和分配变量。我们可以在此时传递数据也可以在以后设置数据
```go
func main() {
// Create a user and set both the first and last name properties
user1 := User{
FirstName: "John",
LastName: "Wick",
}
// Now we have our user object, we can set the data like this
user1.Email = "john@wick.com"
user1.Age = 30
}
```
### 对象方法
Go允许将方法分配给结构。这样可以将相关操作分组到它所影响的数据中。在这个例子中我们将在`User`结构上编写一个方法来生成`User`的全名:
```go
func (u User) FullName() string {
return strings.Join([]string{u.FirstName, u.LastName}, " ")
}
```
此方法将连接用户的名字和姓氏,其间有空格。调用方法可能如下所示:
```go
println(user1.FullName())
```
### 结构标签
Struct标记用于修改编码器处理数据的方式。例如在编码为JSON时设置键名
```go
type User struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
Email string `json:"email"`
Age int `json:"age"`
}
```
### 导出数据
结构可以包含导出(公共)和未导出(私有)属性。这是通过导出的大写首字母或未导出的小写首字母来设置的。在此示例中,我们将使电子邮件属性为私有:
```go
type User struct {
// Exported Data
FirstName string
LastName string
Age int
// Unexported Data
email string
}
```
执行此操作将使以下代码在构建时抛出错误,因为它尝试与未导出的属性进行交互:
```go
user1.email = "john@wick.com"
```
这也适用于方法:
```go
// Exported method. This can be called from anywhere
func (u User) Email() {
return u.email
}
// Unexported method. This can only be called by other methods on this struct
func (u User) updateLoginCount {
// code to update login count...
}
```
### 通过方法修改属性
要从其中一个方法中修改对象的数据,该对象必须是指针。示例可能如下所示:
\`\`\`去 // SetEmail设置用户的电子邮件地址 funcu \* UserSetEmail电子邮件字符串{ u.email =电子邮件 }
//电子邮件访问者 funcu \* UserEmailstring { 返回u.email }
func main{ //创建user1指针 user1 =User { 名字:“约翰”, 姓氏:“威克”, }
```
// Set the user's email address
user1.SetEmail("john@wick.com")
// Access and print the user's email address
println(user1.Email())
```
}