2019-10-15 15:02:01 +03:00

282 lines
12 KiB
Plaintext
Generated
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Go в примерах: Структуры (Structs)</title>
<link rel=stylesheet href="site.css">
</head>
<script>
onkeydown = (e) => {
if (e.key == "ArrowLeft") {
window.location.href = 'pointers';
}
if (e.key == "ArrowRight") {
window.location.href = 'methods';
}
}
</script>
<body>
<div class="example" id="structs">
<h2><a href="./">Go в примерах</a>: Структуры (Structs)</h2>
<table>
<tr>
<td class="docs">
<p><em>Структуры</em> в Go - это коллекции полей определенных
типов. Как правило, они используются для логической
группировки данных.</p>
</td>
<td class="code empty leading">
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<a href="http://play.golang.org/p/sJZCI3Gm3Ht" target="_blank"><img title="Run code" src="play.png" class="run" /></a><img title="Copy code" src="clipboard.png" class="copy" />
<div class="highlight"><pre><span class="kn">package</span> <span class="nx">main</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<div class="highlight"><pre><span class="kn">import</span> <span class="s">&quot;fmt&quot;</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Структура <code>person</code> имеет два поля <code>name</code> и <code>age</code>.</p>
</td>
<td class="code leading">
<div class="highlight"><pre><span class="kd">type</span> <span class="nx">person</span> <span class="kd">struct</span> <span class="p">{</span>
<span class="nx">name</span> <span class="kt">string</span>
<span class="nx">age</span> <span class="kt">int</span>
<span class="p">}</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Функция NewPerson создает новую струкутуру person с
заданным именем.</p>
</td>
<td class="code leading">
<div class="highlight"><pre><span class="kd">func</span> <span class="nx">NewPerson</span><span class="p">(</span><span class="nx">name</span> <span class="kt">string</span><span class="p">)</span> <span class="o">*</span><span class="nx">person</span> <span class="p">{</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Вы можете безопасно вернуть указатель на локальную
переменную, так как локальная переменная переживет
область действия функции.</p>
</td>
<td class="code leading">
<div class="highlight"><pre> <span class="nx">p</span> <span class="o">:=</span> <span class="nx">person</span><span class="p">{</span><span class="nx">name</span><span class="p">:</span> <span class="nx">name</span><span class="p">}</span>
<span class="nx">p</span><span class="p">.</span><span class="nx">age</span> <span class="p">=</span> <span class="mi">42</span>
<span class="k">return</span> <span class="o">&amp;</span><span class="nx">p</span>
<span class="p">}</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<div class="highlight"><pre><span class="kd">func</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Так создается новая структура</p>
</td>
<td class="code leading">
<div class="highlight"><pre> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">person</span><span class="p">{</span><span class="s">&quot;Bob&quot;</span><span class="p">,</span> <span class="mi">20</span><span class="p">})</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Вы можете задавать имена для корректного
присваивания значений при создании структуры</p>
</td>
<td class="code leading">
<div class="highlight"><pre> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">person</span><span class="p">{</span><span class="nx">name</span><span class="p">:</span> <span class="s">&quot;Alice&quot;</span><span class="p">,</span> <span class="nx">age</span><span class="p">:</span> <span class="mi">30</span><span class="p">})</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Пропущенные поля будут нулевыми.</p>
</td>
<td class="code leading">
<div class="highlight"><pre> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">person</span><span class="p">{</span><span class="nx">name</span><span class="p">:</span> <span class="s">&quot;Fred&quot;</span><span class="p">})</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Префикс <code>&amp;</code> возвращает указатель на структуру.</p>
</td>
<td class="code leading">
<div class="highlight"><pre> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">person</span><span class="p">{</span><span class="nx">name</span><span class="p">:</span> <span class="s">&quot;Ann&quot;</span><span class="p">,</span> <span class="nx">age</span><span class="p">:</span> <span class="mi">40</span><span class="p">})</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Можно инкапсулировать создание новой структуры
в функцию</p>
</td>
<td class="code leading">
<div class="highlight"><pre> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">NewPerson</span><span class="p">(</span><span class="s">&quot;Jon&quot;</span><span class="p">))</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Доступ к полям структуры осуществляется через
точку.</p>
</td>
<td class="code leading">
<div class="highlight"><pre> <span class="nx">s</span> <span class="o">:=</span> <span class="nx">person</span><span class="p">{</span><span class="nx">name</span><span class="p">:</span> <span class="s">&quot;Sean&quot;</span><span class="p">,</span> <span class="nx">age</span><span class="p">:</span> <span class="mi">50</span><span class="p">}</span>
<span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">s</span><span class="p">.</span><span class="nx">name</span><span class="p">)</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Вы также можете использовать точки со
структурными указателями - указатели автоматически
разыменовываются.</p>
</td>
<td class="code leading">
<div class="highlight"><pre> <span class="nx">sp</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">s</span>
<span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">sp</span><span class="p">.</span><span class="nx">age</span><span class="p">)</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Структуры мутабельны.</p>
</td>
<td class="code">
<div class="highlight"><pre> <span class="nx">sp</span><span class="p">.</span><span class="nx">age</span> <span class="p">=</span> <span class="mi">51</span>
<span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">sp</span><span class="p">.</span><span class="nx">age</span><span class="p">)</span>
<span class="p">}</span>
</pre></div>
</td>
</tr>
</table>
<table>
<tr>
<td class="docs">
</td>
<td class="code">
<div class="highlight"><pre><span class="gp">$</span> go run structs.go
<span class="go">{Bob 20}</span>
<span class="go">{Alice 30}</span>
<span class="go">{Fred 0}</span>
<span class="go">&amp;{Ann 40}</span>
<span class="go">Sean</span>
<span class="go">50</span>
<span class="go">51</span>
<span class="go">&amp;{Jon 42}</span>
</pre></div>
</td>
</tr>
</table>
<p class="next">
Следующий пример: <a href="methods">Методы (Methods)</a>.
</p>
<p class="footer">
by <a href="https://markmcgranaghan.com">Mark McGranaghan</a> | <a href="https://github.com/mmcgrana/gobyexample/blob/master/examples/structs">source</a> | <a href="https://github.com/mmcgrana/gobyexample#license">license</a>
<br/>
переведено Nick S. | <a href="https://github.com/badkaktus/gobyexample">исходники</a>
</p>
</div>
<script>
var codeLines = [];
codeLines.push('');codeLines.push('package main\u000A');codeLines.push('import \"fmt\"\u000A');codeLines.push('type person struct {\u000A name string\u000A age int\u000A}\u000A');codeLines.push('func NewPerson(name string) *person {\u000A');codeLines.push(' p := person{name: name}\u000A p.age = 42\u000A return &p\u000A}\u000A');codeLines.push('func main() {\u000A');codeLines.push(' fmt.Println(person{\"Bob\", 20})\u000A');codeLines.push(' fmt.Println(person{name: \"Alice\", age: 30})\u000A');codeLines.push(' fmt.Println(person{name: \"Fred\"})\u000A');codeLines.push(' fmt.Println(&person{name: \"Ann\", age: 40})\u000A');codeLines.push(' fmt.Println(NewPerson(\"Jon\"))\u000A');codeLines.push(' s := person{name: \"Sean\", age: 50}\u000A fmt.Println(s.name)\u000A');codeLines.push(' sp := &s\u000A fmt.Println(sp.age)\u000A');codeLines.push(' sp.age = 51\u000A fmt.Println(sp.age)\u000A}\u000A');codeLines.push('');
</script>
<script src="site.js" async></script>
</body>
</html>