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

120 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
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())
```
}