Learning Go Programming 1st Edition Vladimir Vivien

rongpibenal35 4 views 77 slides May 19, 2025
Slide 1
Slide 1 of 77
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77

About This Presentation

Learning Go Programming 1st Edition Vladimir Vivien
Learning Go Programming 1st Edition Vladimir Vivien
Learning Go Programming 1st Edition Vladimir Vivien


Slide Content

Learning Go Programming 1st Edition Vladimir
Vivien install download
https://ebookmeta.com/product/learning-go-programming-1st-
edition-vladimir-vivien/
Download more ebook from https://ebookmeta.com

We believe these products will be a great fit for you. Click
the link to download now, or visit ebookmeta.com
to discover even more!
Learning Go Programming 1st Edition Vladimir Vivien
https://ebookmeta.com/product/learning-go-programming-1st-
edition-vladimir-vivien/
Learning Go: An Idiomatic Approach to Real-world Go
Programming, 2nd Edition Jon Bodner
https://ebookmeta.com/product/learning-go-an-idiomatic-approach-
to-real-world-go-programming-2nd-edition-jon-bodner/
Kubernetes Programming with Go: Programming Kubernetes
Clients and Operators Using Go and the Kubernetes API
1st Edition Philippe Martin
https://ebookmeta.com/product/kubernetes-programming-with-go-
programming-kubernetes-clients-and-operators-using-go-and-the-
kubernetes-api-1st-edition-philippe-martin-2/
OBJECT ORIENTED PROGRAMMING First Edition M A. Ansari
https://ebookmeta.com/product/object-oriented-programming-first-
edition-m-a-ansari/

Deconstruction An American Institution 1st Edition
Gregory Jones-Katz
https://ebookmeta.com/product/deconstruction-an-american-
institution-1st-edition-gregory-jones-katz/
Tissue Resident Macrophages Methods and Protocols
Methods in Molecular Biology 2713 Elvira Mass Editor
https://ebookmeta.com/product/tissue-resident-macrophages-
methods-and-protocols-methods-in-molecular-biology-2713-elvira-
mass-editor/
New senior mathematics extension 2 for year 12 Third
Edition. Edition Bob Aus
https://ebookmeta.com/product/new-senior-mathematics-
extension-2-for-year-12-third-edition-edition-bob-aus/
20 Day Trips in and Around the Shawnee National Forest
1st Edition Larry P. Mahan
https://ebookmeta.com/product/20-day-trips-in-and-around-the-
shawnee-national-forest-1st-edition-larry-p-mahan/
Political Theory An Introduction 5th Edition Andrew
Heywood
https://ebookmeta.com/product/political-theory-an-
introduction-5th-edition-andrew-heywood/

Lectures on Quantum Mechanics 2nd edition Steven
Weinberg
https://ebookmeta.com/product/lectures-on-quantum-mechanics-2nd-
edition-steven-weinberg/

Table of Contents
Learning Go Programming
Credits
About the Author
About the Reviewers
www.PacktPub.com
Why subscribe?
Preface
What this book covers
What you need for this book
Who this book is for
Conventions
Reader feedback
Customer support
Downloading the example code
Downloading the color images of this book
Errata
Piracy
Questions
1. A First Step in Go
The Go programming language
Playing with Go
No IDE required
Installing Go
Source code examples
Your first Go program
Go in a nutshell
Functions
Packages
The workspace
Strongly typed
Composite types
The named type
Methods and objects

Interfaces
Concurrency and channels
Memory management and safety
Fast compilation
Testing and code coverage
Documentation
An extensive library
The Go Toolchain
Summary
2. Go Language Essentials
The Go source file
Optional semicolon
Multiple lines
Go identifiers
The blank identifier
Muting package imports
Muting unwanted function results
Built-in identifiers
Types
Values
Functions
Go variables
Variable declaration
The zero-value
Initialized declaration
Omitting variable types
Short variable declaration
Restrictions for short variable declaration
Variable scope and visibility
Variable declaration block
Go constants
Constant literals
Typed constants
Untyped constants
Assigning untyped constants
Constant declaration block
Constant enumeration

Overriding the default enumeration type
Using iota in expressions
Skipping enumerated values
Go operators
Arithmetic operators
The increment and decrement operators
Go assignment operators
Bitwise operators
Logical Operators
Comparison operators
Operator precedence
Summary
3. Go Control Flow
The if statement
The if statement initialization
Switch statements
Using expression switches
The fallthrough cases
Expressionless switches
Switch initializer
Type switches
The for statements
For condition
Infinite loop
The traditional for statement
The for range
The break, continue, and goto statements
The label identifier
The break statement
The continue statement
The goto statement
Summary
4. Data Types
Go types
Numeric types
Unsigned integer types
Signed integer types

Floating point types
Complex number types
Numeric literals
Boolean type
Rune and string types
The rune
The string
Interpreted and raw string literals
Pointers
The pointer type
The address operator
The new() function
Pointer indirection - accessing referenced values
Type declaration
Type conversion
Summary
5. Functions in Go
Go functions
Function declaration
The function type
Variadic parameters
Function result parameters
Named result parameters
Passing parameter values
Achieving pass-by-reference
Anonymous Functions and Closures
Invoking anonymous function literals
Closures
Higher-order functions
Error signaling and handling
Signaling errors
Error handling
The error type
Deferring function calls
Using defer
Function panic and recovery
Function panic

Function panic recovery
Summary
6. Go Packages and Programs
The Go package
Understanding the Go package
The workspace
Creating a workspace
The import path
Creating packages
Declaring the package
Multi-File packages
Naming packages
Use globally unique namespaces
Add context to path
Use short names
Building packages
Installing a package
Package visibility
Package member visibility
Importing package
Specifying package identifiers
The dot identifier
The blank identifier
Package initialization
Creating programs
Accessing program arguments
Building and installing programs
Remote packages
Summary
7. Composite Types
The array type
Array initialization
Declaring named array types
Using arrays
Array length and capacity
Array traversal
Array as parameters

The slice type
Slice initialization
Slice representation
Slicing
Slicing a slice
Slicing an array
Slice expressions with capacity
Making a slice
Using slices
Slices as parameters
Length and capacity
Appending to slices
Copying slices
Strings as slices
The map type
Map initialization
Making Maps
Using maps
Map traversal
Map functions
Maps as parameters
The struct type
Accessing struct fields
Struct initialization
Declaring named struct types
The anonymous field
Promoted fields
Structs as parameters
Field tags
Summary
8. Methods, Interfaces, and Objects
Go methods
Value and pointer receivers
Objects in Go
The struct as object
Object composition
Field and method promotion

The constructor function
The interface type
Implementing an interface
Subtyping with Go interfaces
Implementing multiple interfaces
Interface embedding
The empty interface type
Type assertion
Summary
9. Concurrency
Goroutines
The go statement
Goroutine scheduling
Channels
The Channel type
The send and receive operations
Unbuffered channel
Buffered channel
Unidirectional channels
Channel length and capacity
Closing a channel
Writing concurrent programs
Synchronization
Streaming data
Using for…range to receive data
Generator functions
Selecting from multiple channels
Channel timeout
The sync package
Synchronizing with mutex locks
Synchronizing access to composite values
Concurrency barriers with sync.WaitGroup
Detecting race conditions
Parallelism in Go
Summary
10. Data IO in Go
IO with readers and writers

The io.Reader interface
Chaining readers
The io.Writer interface
Working with the io package
Working with files
Creating and opening files
Function os.OpenFile
Files writing and reading
Standard input, output, and error
Formatted IO with fmt
Printing to io.Writer interfaces
Printing to standard output
Reading from io.Reader
Reading from standard input
Buffered IO
Buffered writers and readers
Scanning the buffer
In-memory IO
Encoding and decoding data
Binary encoding with gob
Encoding data as JSON
Controlling JSON mapping with struct tags
Custom encoding and decoding
Summary
11. Writing Networked Services
The net package
Addressing
The net.Conn Type
Dialing a connection
Listening for incoming connections
Accepting client connections
A TCP API server
Connecting to the TCP server with telnet
Connecting to the TCP server with Go
The HTTP package
The http.Client type
Configuring the client

Handling client requests and responses
A simple HTTP server
The default server
Routing requests with http.ServeMux
The default ServeMux
A JSON API server
Testing the API server with cURL
An API server client in Go
A JavaScript API server client
Summary
12. Code Testing
The Go test tool
Test file names
Test organization
Writing Go tests
The test functions
Running the tests
Filtering executed tests
Test logging
Reporting failure
Skipping tests
Table-driven tests
HTTP testing
Testing HTTP server code
Testing HTTP client code
Test coverage
The cover tool
Code benchmark
Running the benchmark
Skipping test functions
The benchmark report
Adjusting N
Comparative benchmarks
Summary

Learning Go Programming

Learning Go Programming
Copyright © 2016 Packt Publishing
All rights reserved. No part of this book may be reproduced, stored in
a retrieval system, or transmitted in any form or by any means,
without the prior written permission of the publisher, except in the
case of brief quotations embedded in critical articles or reviews.
Every effort has been made in the preparation of this book to ensure
the accuracy of the information presented. However, the information
contained in this book is sold without warranty, either express or
implied. Neither the author, nor Packt Publishing, and its dealers and
distributors will be held liable for any damages caused or alleged to
be caused directly or indirectly by this book.
Packt Publishing has endeavored to provide trademark information
about all of the companies and products mentioned in this book by
the appropriate use of capitals. However, Packt Publishing cannot
guarantee the accuracy of this information.
First published: October 2016
Production reference: 1201016
Published by Packt Publishing Ltd.
Livery Place
35 Livery Street
Birmingham
B3 2PB, UK.
ISBN 978-1-78439-543-8

www.packtpub.com

Credits
Authors
Vladimir Vivien
Copy Editor
Safis Editing
Reviewers
Quintessence Anx
Parth Desai
Abhishek Kumar
Chris Schaefer
Project Coordinator
Nidhi Joshi
Commissioning Editor
Akram Hussain
Proofreader
Safis Editing
Acquisition Editor
Manish Nainnani
Indexer
Aishwarya Gangawane
Content Development Editor
Aishwarya Pandere
Graphics
Disha Haria
Technical Editor Production Coordinator

Mohita Vyas Nilesh Mohite

About the Author
Vladimir Vivien (@vladimirvivien) is a software engineer living in
the United States. He is a previously published author and has
written code in languages such as Java, JavaScript, Python, C to
name a few. Vladimir has work in diverse industries including
technology, publishing, financial, and healthcare. After years of
building enterprise systems using Java, Vladimir came to Go for its
simplicity and stayed for its concurrency and fast build time. Vladimir
continues to use Go as his primary language to build and create
open source software (https://github.com/vladimirivivien).

About the Reviewers
Quintessence Anx. is a superhero (also called as Cloud Engineer)
at Stark & Wayne LLC by day and an astronomer with a passion for
the Internet of Things by night. She is a chapter leader for her local
Girl Develop It, where she empowers women programmers of all
levels and abilities through classes and hands-on project
experiences, as well as co-founder of City of Light 2.0, an
organization working to bring more affordable, reliable, and faster
internet to Western New York
Parth Desai is a polygot programmer and architect, and has worked
on almost all popular languages like Golang, python, C#. He
regularly contributes to various open-source golang projects, like a
notification engine called “Khabar”, a http framework written in
golang called “Gottp”, and media server called “moire”. He
implemented url signing protocol using cryptography in python, from
scratch.
He has also written custom single sign on solution (SSO) in c#, with
proper implementation of oauth and saml protocols. He also
developed pluggable architecture to facilitate easier adding and
removing of authentication providers for the SSO. Currently, He is
working as a lead backend engineer, and designing and
implementing scalable systems in golang and python. You can reach
out to him on linkedin at https://in.linkedin.com/in/parthdesai08. Or
on his email-id [email protected].
Abhishek Kumar is a technologist in IT Industry since 2010 mainly
working in Systems Programming, DevOps Practices and Security.
He likes to keep in sync with all domains, paradigms and up-coming
technologies to get a wholistic approach for problem solving and
planning ahead. He loves to learn new programming languages.
Abhishek has been using Golang since 2012. He started a
timeseries datastore project in Golang by Sep'2013 and is currently
pivoting it. [ @abionic | https://abhishekkr.github.io ]

Want to thank my mother ShivPyari to enable me choose my own
path
Chris Schaefer software developer with a passion for learning new
things. He enjoys writing code and participating in local community
software events.

www.PacktPub.com
For support files and downloads related to your book, please
visit www.PacktPub.com.
Did you know that Packt offers eBook versions of every book
published, with PDF and ePub files available? You can upgrade to
the eBook version at www.PacktPub.com and as a print book
customer, you are entitled to a discount on the eBook copy. Get in
touch with us at [email protected] for more details.
At www.PacktPub.com, you can also read a collection of free
technical articles, sign up for a range of free newsletters and receive
exclusive discounts and offers on Packt books and eBooks.
https://www.packtpub.com/mapt
Get the most in-demand software skills with Mapt. Mapt gives you
full access to all Packt books and video courses, as well as industry-
leading tools to help you plan your personal development and
advance your career.
Why subscribe?
Fully searchable across every book published by Packt
Copy and paste, print, and bookmark content
On demand and accessible via a web browser

Preface
Go is an open source programming language that lets programmers
easily build reliable and scalable programs. It does this by offering a
simple syntax which makes it fun to write correct and predictable
code using concurrency idioms and a robust standard library.
Go has a large and active online community and there are several
Go conferences that take place around the world yearly. Starting
with https://golang.org/, you will find numerous places on the web
that provide documentations, blogs, videos, and slides that cover a
wide range of Go-related topics. On GitHub, the story is no different;
some of the best known projects that are driving the future of cloud
computing, for instance, are written in Go with an ever growing list.
As you would expect, getting started with Go is simple, fast, and well
documented. However, “getting into” Go can be more challenging,
especially for newcomers from other languages. My first attempt at
Go failed. Even after reading the prescribed documentations and
going through the tutorials, there was a gap in understanding driven
by my own biases from previous programming experiences. Months
later I returned to Go and got into it. This time I read the language
specs, I read blogs, watch videos, and searched the web for any
discussion that provided design motivations and in-depth
explanations of the language.
Learning Go is a book intended to help new, and seasoned
programmers alike, to get into the Go programming language. With
this book, I have attempted to write the book I would have like to
have read when I was starting out with Go. It distills the language
specs, the documentations, the blogs, the videos, slides, and my
own experiences of writing Go into content that carefully provides the
right amount of depth and insights to help you understand the
language and its design.
I hope that you enjoy it.

What this book covers
Chapter 1, A First Step in Go, the reader is introduced to Go at a
high-level and take a tour of the features that have made the
language a favorite among its adopters.
Chapter 2, Go Language Essentials, this chapter starts with a
deeper exploration Go’s syntax and other language elements such
as source files, variables, and operators.
Chapter 3, Go Control Flow, examines Go program control flow
elements including if, loop, and switch statements.
Chapter 4, Data Types, introduces its readers to Go’s type system
including detail about built-in types, type declaration, and conversion.
Chapter 5, Functions in Go, discusses the characteristics of the Go
function type including definition, assignment, variadic parameters,
and closures.
Chapter 6, Go Packages and Program Structures, introduces
readers to the organization of functions as a logical grouping known
as packages and programs.
Chapter 7, Composite Types, this chapter continues the discussion
Go types by introducing the reader to Go’s composite types such as
arrays, slices, maps, and structs.
Chapter 8, Methods, Interfaces, and Objects, introduces the reader
to Go idioms and features that can be used to create and compose
object structures.
Chapter 9, Concurrency, introduces the reader to the topics of writing
concurrent programs in Go using language constructs such as
goroutines and channels.

Chapter 10, Data IO in Go, covers the built-in interfaces and APIs to
achieve streaming input, output, and encoding of data.
Chapter 11, Writing Networked Services, explores the Go’s standard
library for creating connected applications using covering topics from
low-level TCP protocols to HTTP an RPC.
Chapter 12, Code Testing, here readers are introduced to Go’s
inherent support and tools for code testing and benchmarking.

What you need for this book
To follow the examples in this book, you will need Go version 1.6 or
later. Go supports architectures including AMD64, x386, and ARM
running the following operating systems:
Windows XP (or later)
Mac OSX 10.7 (or later)
Linux 2.6 (or later)
FreeBSD 8 (or later)

Who this book is for
If you have prior exposure to programming and are interested
learning the Go, this book is designed for you. While it assumes that
you are familiar with concepts such as variables, data types, arrays,
methods, and functions, the book is designed to allow you to follow
chapter by chapter or skip around to the topics you want to learn
about.

Conventions
In this book, you will find a number of text styles that distinguish
between different kinds of information. Here are some examples of
these styles and an explanation of their meaning.
Code words in text, database table names, folder names, filenames,
file extensions, pathnames, dummy URLs, user input, and Twitter
handles are shown as follows: "Save the source code in a file called
helloworld.go anywhere inside your GOPATH."
A block of code is set as follows:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Any command-line input or output is written as follows:
$> go version
go version go1.6.1 linux/amd64
New terms and important words are shown in bold. Words that you
see on the screen, for example, in menus or dialog boxes, appear in
the text like this: "If all goes well, you should see the message Hello,
World! output on your screen.."
Note
Warnings or important notes appear in a box like this.
Tip

Tips and tricks appear like this.

Reader feedback
Feedback from our readers is always welcome. Let us know what
you think about this book-what you liked or disliked. Reader
feedback is important for us as it helps us develop titles that you will
really get the most out of. To send us general feedback, simply e-
mail [email protected], and mention the book's title in the
subject of your message. If there is a topic that you have expertise in
and you are interested in either writing or contributing to a book, see
our author guide at www.packtpub.com/authors.

Customer support
Now that you are the proud owner of a Packt book, we have a
number of things to help you to get the most from your purchase.
Downloading the example code
You can download the example code files for this book from your
account at http://www.packtpub.com. If you purchased this book
elsewhere, you can visit http://www.packtpub.com/support and
register to have the files e-mailed directly to you.
You can download the code files by following these steps:
1. Log in or register to our website using your e-mail address and
password.
2. Hover the mouse pointer on the SUPPORT tab at the top.
3. Click on Code Downloads & Errata.
4. Enter the name of the book in the Search box.
5. Select the book for which you're looking to download the code
files.
6. Choose from the drop-down menu where you purchased this
book from.
7. Click on Code Download.
Once the file is downloaded, please make sure that you unzip or
extract the folder using the latest version of:
WinRAR / 7-Zip for Windows
Zipeg / iZip / UnRarX for Mac
7-Zip / PeaZip for Linux
The code bundle for the book is also hosted on GitHub at
https://github.com/PacktPublishing/Learning-Go-Programming. We
also have other code bundles from our rich catalog of books and

videos available at https://github.com/PacktPublishing/. Check them
out!
Downloading the color images of this
book
We also provide you with a PDF file that has color images of the
screenshots/diagrams used in this book. The color images will help
you better understand the changes in the output. You can download
this file from
http://www.packtpub.com/sites/default/files/downloads/LearningGoPr
ograming_ColorImages.pdf.
Errata
Although we have taken every care to ensure the accuracy of our
content, mistakes do happen. If you find a mistake in one of our
books-maybe a mistake in the text or the code-we would be grateful
if you could report this to us. By doing so, you can save other
readers from frustration and help us improve subsequent versions of
this book. If you find any errata, please report them by visiting
http://www.packtpub.com/submit-errata, selecting your book, clicking
on the Errata Submission Form link, and entering the details of
your errata. Once your errata are verified, your submission will be
accepted and the errata will be uploaded to our website or added to
any list of existing errata under the Errata section of that title.
To view the previously submitted errata, go to
https://www.packtpub.com/books/content/support and enter the
name of the book in the search field. The required information will
appear under the Errata section.
Piracy

Piracy of copyrighted material on the Internet is an ongoing problem
across all media. At Packt, we take the protection of our copyright
and licenses very seriously. If you come across any illegal copies of
our works in any form on the Internet, please provide us with the
location address or website name immediately so that we can
pursue a remedy.
Please contact us at [email protected] with a link to the
suspected pirated material.
We appreciate your help in protecting our authors and our ability to
bring you valuable content.
Questions
If you have a problem with any aspect of this book, you can contact
us at [email protected], and we will do our best to address
the problem.

Chapter 1. A First Step in Go
In the first chapter of the book, you will be introduced to Go and take
a tour of the features that have made the language a favorite among
its adopters. The start of the chapter provides the motivation behind
the Go programming language. If you are impatient, however, you
are welcome to skip to any of the other topics and learn how to write
your first Go program. Finally, the Go in a nutshell section provides a
high-level summary of the characteristics of the language.
The following topics are covered in this chapter:
The Go programming language
Playing with Go
Installing Go
Your first Go program
Go in a nutshell
The Go programming language
Since the invention of the C language in the early 1970s by Dennis
Ritchie at Bell Labs, the computing industry has produced many
popular languages that are based directly on (or have borrowed
ideas from) its syntax. Commonly known as the C-family of
languages, they can be split into two broad evolutionary branches. In
one branch, derivatives such as C++, C#, and Java have evolved to
adopt a strong type system, object orientation, and the use of
compiled binaries. These languages, however, tend to have a slow
build-deploy cycle and programmers are forced to adopt a complex
object-oriented type system to attain runtime safety and speed of
execution:

In the other evolutionary linguistic branch are languages such as
Perl, Python, and JavaScript that are described as dynamic
languages for their lack of type safety formalities, use of lightweight
scripting syntax, and code interpretation instead of compilation.
Dynamic languages have become the preferred tool for web and
cloud scale development where speed and ease of deployment are
valued over runtime safety. The interpreted nature of dynamic
languages means, however, they generally run slower than their
compiled counterparts. In addition, the lack of type safety at runtime
means the correctness of the system scales poorly as the application
grows.
Go was created as a system language at Google in 2007 by Robert
Griesemer, Rob Pike, and Ken Thomson to handle the needs of
application development. The designers of Go wanted to mitigate the
issues with the aforementioned languages while creating a new
language that is simple, safe, consistent, and predictable. As Rob
Pike puts it:
"Go is an attempt to combine the safety and performance of a
statically-typed language with the expressiveness and convenience
of a dynamically-typed interpreted language."
Go borrows ideas from different languages that came before it,
including:

Simplified but concise syntax that is fun and easy to use
A type of system that feels more like a dynamic language
Support for object-oriented programming
Statically typed for compilation and runtime safety
Compiled to native binaries for fast runtime execution
Near-zero compilation time that feels more like an interpreted
language
A simple concurrency idiom to leverage multi-core, multi-chip
machines
A garbage collector for safe and automatic memory
management
The remainder of this chapter will walk you through an introductory
set of steps that will give you a preview of the language and get you
started with building and running your first Go program. It is a
precursor to the topics that are covered in detail in the remaining
chapters of the book. You are welcome to skip to other chapters if
you already have a basic understanding of Go.

Playing with Go
Before we jump head-first into installing and running Go tools on
your local machine, let us take a look at the Go Playground. The
creators of the language have made available a simple way to
familiarize yourself with the language without installing any tools.
Known as the Go Playground, it is a web-based tool, accessible from
https://play.golang.org/, that uses an editor metaphor to let
developers test their Go skills by writing code directly within the web
browser window. The Playground gives its users the ability to
compile and run their code on Google's remote servers and get
immediate results as shown in the following screenshot:
The editor is basic, as it is meant to be used as a learning tool and a
way to share code with others. The Playground includes practical
features such as line numbers and formatting to ensure your code
remains readable as it goes beyond a few lines long. Since this is a

free service that consumes real compute resources, Google
understandably imposes a few limitations on what can be done with
Playground:
You are restricted on the amount of memory your code will
consume
Long-running programs will be killed
Access to files is simulated with an in-memory filesystem.
Network access is simulated against the loopback interface only
No IDE required
Besides the Go Playground, how is one supposed to write Go code
anyway? Writing Go does not require a fancy Integrated
Development Environment (IDE). As a matter of fact, you can get
started writing your simple Go programs with your favorite plain text
editor that is bundled with your OS. There are, however, Go plugins
for most major text editors (and full-blown IDEs) such as Atom, Vim,
Emacs, Microsoft Code, IntelliJ, and many others. There is a
complete list of editors and IDE plugins for Go which can be found at
https://github.com/golang/go/wiki/IDEsAndTextEditorPlugins.
Installing Go
To start programming with Go on your local machine you will need to
install the Go Toolchain on your computer. At the time of writing, Go
comes ready to be installed on the following major OS platforms:
Linux
FreeBSD Unix
Mac OSX
Windows
The official installation packages are all available for 32-bit and 64-
bit Intel-based architectures. There are also official binary releases
that are available for ARM architectures as well. As Go grows in

popularity, there will certainly be more binary distribution choices
made available in the future.
Let us skip the detailed installation instructions as they will certainly
change by the time you read this. Instead, you are invited to visit
http://golang.org/doc/install and follow the directions given for your
specific platform. Once completed, be sure to test your installation is
working before continuing to use the following command:
$> go version
go version go1.6.1 linux/amd64
The previous command should print the version number, target OS,
and the machine architecture where Go and its tools are installed. If
you do not get an output similar to that preceding command, ensure
to add the path of the Go binaries to your OS's execution PATH
environment variable.
Before you start writing your own code, ensure that you have
properly set up your GOPATH. This is a local directory where your Go
source files and compiled artifacts are saved as you use the Go
Toolchain. Follow the instructions found in
https://golang.org/doc/install#testing to set up your GOPATH.
Source code examples
The programming examples presented throughout this book are
available on the GitHub source code repository service. There you
will find all source files grouped by chapters in the repository
at https://github.com/vladimirvivien/learning-go/. To save the readers
a few keystrokes, the examples use a shortened URL, that starts
with golang.fyi, that points directly to the respective file in GitHub.
Alternatively, you can follow along by downloading and unzipping (or
cloning) the repository locally. Create a directory structure in your
GOPATH so that the root of the source files is located at
$GOPATH/src/github.com/vladimirvivien/learning-go/ .

Your first Go program
After installing the Go tools successfully on your local machine, you
are now ready to write and execute your first Go program. For that,
simply open your favorite text editor and type in the simple Hello
World program shown in the following code:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
golang.fyi/ch01/helloworld.go
Save the source code in a file called helloworld.go anywhere inside
your GOPATH. Then use the following Go command to compile and
run the program:
$> go run helloworld.go
Hello, World!
If all goes well, you should see the message Hello, World! output on
your screen. Congratulations, you have just written and executed
your first Go program. Now, let us explore the attributes and
characteristics of the Go language at a high level.

Go in a nutshell
By design, Go has a simple syntax. Its designers wanted to create a
language that is clear, concise, and consistent with few syntactic
surprises. When reading Go code, keep this mantra in mind: what
you see is what it is. Go shies away from a clever and terse coding
style in favor of code that is clear and readable as exemplified by the
following program:
// This program prints molecular information for
known metalloids
// including atomic number, mass, and atom count
found
// in 100 grams of each element using the mole
unit.
// See http://en.wikipedia.org/wiki/Mole_(unit)
package main

import "fmt"

const avogadro float64 = 6.0221413e+23
const grams = 100.0

type amu float64

func (mass amu) float() float64 {
return float64(mass)
}

type metalloid struct {
name string
number int32
weight amu
}

var metalloids = []metalloid{
metalloid{"Boron", 5, 10.81},
metalloid{"Silicon", 14, 28.085},
metalloid{"Germanium", 32, 74.63},
metalloid{"Arsenic", 33, 74.921},
metalloid{"Antimony", 51, 121.760},
metalloid{"Tellerium", 52, 127.60},
metalloid{"Polonium", 84, 209.0},

}

// finds # of moles
func moles(mass amu) float64 {
return float64(mass) / grams
}

// returns # of atoms moles
func atoms(moles float64) float64 {
return moles * avogadro
}

// return column headers
func headers() string {
return fmt.Sprintf(
"%-10s %-10s %-10s Atoms in %.2f Grams\n",
"Element", "Number", "AMU", grams,
)
}

func main() {
fmt.Print(headers())

for _, m := range metalloids {
fmt.Printf(
"%-10s %-10d %-10.3f %e\n",
m.name, m.number, m.weight.float(),
atoms(moles(m.weight)),
)
}
}
golang.fyi/ch01/metalloids.go
When the code is executed, it will give the following output:
$> go run metalloids.go
Element Number AMU Atoms in 100.00
Grams
Boron 5 10.810 6.509935e+22
Silicon 14 28.085 1.691318e+23
Germanium 32 74.630 4.494324e+23
Arsenic 33 74.921 4.511848e+23
Antimony 51 121.760 7.332559e+23
Tellerium 52 127.600 7.684252e+23
Polonium 84 209.000 1.258628e+24

If you have never seen Go before, you may not understand some of
the details of the syntax and idioms used in the previous program.
Nevertheless, when you read the code, there is a good chance you
will be able to follow the logic and form a mental model of the
program's flow. That is the beauty of Go's simplicity and the reason
why so many programmers use it. If you are completely lost, no need
to worry, as the subsequent chapters will cover all aspects of the
language to get you going.
Functions
Go programs are composed of functions, the smallest callable code
unit in the language. In Go, functions are typed entities that can
either be named (as shown in the previous example) or be assigned
to a variable as a value:
// a simple Go function
func moles(mass amu) float64 {
return float64(mass) / grams
}
Another interesting feature about Go functions is their ability to return
multiple values as a result of a call. For instance, the previous
function could be re-written to return a value of type error in addition
to the calculated float64 value:
func moles(mass amu) (float64, error) {
if mass < 0 {
return 0, error.New("invalid mass")
}
return (float64(mass) / grams), nil
}
The previous code uses the multi-return capabilities of Go functions
to return both the mass and an error value. You will encounter this
idiom throughout the book used as a mean to properly signal errors

to the caller of a function. There will be further discussion on multi-
return value functions covered in Chapter 5, Functions in Go.
Packages
Source files containing Go functions can be further organized into
directory structures known as a package. Packages are logical
modules that are used to share code in Go as libraries. You can
create your own local packages or use tools provided by Go to
automatically pull and use remote packages from a source code
repository. You will learn more about Go packages in Chapter 6, Go
Packages and Programs.
The workspace
Go follows a simple code layout convention to reliably organize
source code packages and to manage their dependencies. Your
local Go source code is stored in the workspace, which is a directory
convention that contains the source code and runtime artifacts. This
makes it easy for Go tools to automatically find, build, and install
compiled binaries. Additionally, Go tools rely on the workspace setup
to pull source code packages from remote repositories, such as Git,
Mercurial, and Subversion, and satisfy their dependencies.
Strongly typed
All values in Go are statically typed. However, the language offers a
simple but expressive type system that can have the feel of a
dynamic language. For instance, types can be safely inferred as
shown in the following code snippet:
const grams = 100.0
As you would expect, constant grams would be assigned a numeric
type, float64, to be precise, by the Go type system. This is true not

only for constants, but any variable can use a short-hand form of
declaration and assignment as shown in the following example:
package main
import "fmt"
func main() {
var name = "Metalloids"
var triple = [3]int{5,14,84}
elements := []string{"Boron","Silicon",
"Polonium"}
isMetal := false
fmt.Println(name, triple, elements, isMetal)

}
Notice that the variables, in the previous code snippet, are not
explicitly assigned a type. Instead, the type system assigns each
variable a type based on the literal value in the assignment. Chapter
2, Go Language Essentials and Chapter 4, Data Types, go into more
details regarding Go types.
Composite types
Besides the types for simple values, Go also supports composite
types such as array, slice, and map. These types are designed to
store indexed elements of values of a specified type. For instance,
the metalloid example shown previously makes use of a slice, which
is a variable-sized array. The variable metalloid is declared as a
slice to store a collection of the type metalloid. The code uses the
literal syntax to combine the declaration and assignment of a slice
of type metalloid:
var metalloids = []metalloid{
metalloid{"Boron", 5, 10.81},
metalloid{"Silicon", 14, 28.085},
metalloid{"Germanium", 32, 74.63},
metalloid{"Arsenic", 33, 74.921},
metalloid{"Antimony", 51, 121.760},
metalloid{"Tellerium", 52, 127.60},

metalloid{"Polonium", 84, 209.0},
}
Go also supports a struct type which is a composite that stores
named elements called fields as shown in the following code:
func main() {
planet := struct {
name string
diameter int
}{"earth", 12742}
}
The previous example uses the literal syntax to declare struct{name
string; diameter int} with the value {"earth", 12742}. You can
read all about composite types in Chapter 7, Composite Types.
The named type
As discussed, Go provides a healthy set of built-in types, both simple
and composite. Go programmers can also define new named types
based on an existing underlying type as shown in the following
snippet extracted from metalloid in the earlier example:
type amu float64

type metalloid struct {
name string
number int32
weight amu
}
The previous snippet shows the definition of two named types, one
called amu, which uses type float64 as its underlying type. Type
metalloid, on the other hand, uses a struct composite type as its
underlying type, allowing it to store values in an indexed data
structure. You can read more about declaring new named types in
Chapter 4, Data Types.

Methods and objects
Go is not an object-oriented language in a classical sense. Go types
do not use a class hierarchy to model the world as is the case with
other object-oriented languages. However, Go can support the
object-based development idiom, allowing data to receive behaviors.
This is done by attaching functions, known as methods, to named
types.
The following snippet, extracted from the metalloid example, shows
the type amu receiving a method called float() that returns the mass
as a float64 value:
type amu float64

func (mass amu) float() float64 {
return float64(mass)
}
The power of this concept is explored in detail in Chapter 8,
Methods, Interfaces, and Objects.
Interfaces
Go supports the notion of a programmatic interface. However, as you
will see in Chapter 8, Methods, Interfaces, and Objects, the Go
interface is itself a type that aggregates a set of methods that can
project capabilities onto values of other types. Staying true to its
simplistic nature, implementing a Go interface does not require a
keyword to explicitly declare an interface. Instead, the type system
implicitly resolves implemented interfaces using the methods
attached to a type.
For instance, Go includes the built-in interface called Stringer,
defined as follows:

type Stringer interface {
String() string
}
Any type that has the method String() attached, automatically
implements the Stringer interface. So, modifying the definition of the
type metalloid, from the previous program, to attach the method
String() will automatically implement the Stringer interface:
type metalloid struct {
name string
number int32
weight amu
}
func (m metalloid) String() string {
return fmt.Sprintf(
"%-10s %-10d %-10.3f %e",
m.name, m.number, m.weight.float(),
atoms(moles(m.weight)),
)
}
golang.fyi/ch01/metalloids2.go
The String() methods return a pre-formatted string that represents
the value of a metalloid. The function Print(), from the standard
library package fmt, will automatically call the method String(), if its
parameter implements stringer. So, we can use this fact to print
metalloid values as follow:
func main() {
fmt.Print(headers())
for _, m := range metalloids {
fmt.Print(m, "\n")
}
}
Again, refer to Chapter 8, Methods, Interfaces, and Objects, for a
thorough treatment of the topic of interfaces.

Other documents randomly have
different content

Sitä ei tiennyt kukaan.
— Lähtivät varmaan omasta aloitteestaan, huomautti Ramsay.
— Mikä olikin tässä tilanteessa viisainta, sanoi Döbeln, joka oli
äkkiä hillinnyt itsensä.
He hyppäsivät satulaan ja karauttivat maantielle. Koko kylä oli jo
peittynyt sakeaan ruudinsavupilveen. Tuon pilven sisällä salamoi,
jyrisi ja paukkui, sieltä kaikui hurraahuutoja ja monia muita huutoja
ja ääniä. Se kaikki sekaantui yhdeksi ainoaksi valtavaksi pauhinaksi.
Mitä siellä mahtoikaan tapahtua ja mihin suuntaan kehittyivät asiat
pilven sisällä, kyselivät itseltään kammonsekaisella jännityksellä
syrjästäkatsojat. Mutta olkaa huoleti te paikkakuntalaiset Simsiöllä ja
te sotaveikot Ritamäellä. Porilaisten raivoisa sisu, heidän
musketinperänsä ja pitkät pistimensä tekevät puhdasta jälkeä. Talo
talolta, sola solalta, nurkka nurkalta he ajavat noita kutsumattomia
vieraita kuin russakoita ulos Lapuan Isostakylästä. Ryske ja pauhina
käy joka talon pihalla, sieltä kuuluu karjuntaa, kuolinvoihkauksia ja
päälleryntäävien porilaisten katkeamatonta hurraamista.
Pitäen silmällä kokonaisuutta Döbeln eteni adjutanttinsa seurassa
pitkin maantietä. Kylän piiriin tullessaan hän huomasi, että joen
takana, kirkon ja pappilan ympärillä, vilahteli myöskin venäläisiä.
Hän lähetti Ramsayn viemään kapteeni von Konowille käskyä, että
hän varaketjussa olevan komppaniansa kanssa hyökkäisi sillan yli
joen taakse ja puhdistaisi sen puolen vihollisista.
Käskyn täytettyään ja palatessaan päällikkönsä luo huomasi
Ramsay yhtäkkiä Qvantenin, joka makasi selällään hamppupellon
pientareella heitellen oikeata kättänsä kuin kuumesairas. Ramsay
heittäytyi satulasta ja juoksi hänen luokseen.

— Kuinka on laitasi, veli? hän kysyi ja polvistui toverinsa viereen.
Qvanten liikutti kuivia huuliaan, mutta ei saanut mitään sanotuksi.
Hänen kyljessään oli ammottava musketinkuulan jälki, josta pulppusi
verta. Kun Ramsay oli antanut hänelle taskumatistaan virkistystä,
levisi Qvantenin kalvenneille kasvoille hymyn häive ja hän sanoi
heikolla äänellä:
— Minun marssini on päättynyt. Kiitos toveruudestasi. Ja sitten…
kuule, se kolmas oli sittenkin Loviisa. Mutta minut oli määrätty
kihloihin ainoastaan isänmaan kanssa. Sano viime tervehdykseni
äidille ja Loviisalle. Ja kiitos kaikesta.
Hän ummisti voipuneena silmänsä. Ramsay pysäytti kaksi ohi
juoksevaa sotilasta. Näiden musketeista ja toisen päällysviitasta
muodostettiin nopeasti paarit ja sotilaat lähtivät kiireesti kantamaan
tajutonta Qvantenia Ritamäelle.
Silmä kosteana Ramsay tuijotti hetkisen sotilaitten jälkeen heidän
kantaessaan pois hänen parasta toveriaan. Entistä elävämmin hän oli
samalla näkevinään äitinsä kyyneleisin silmin kahden ruumiskirstun
ääressä. Mutta tätä kesti vain silmänräpäyksen. Seuraavassa
hetkessä hän syöksyi jo satulaan ja ajoi täyttä neliä takaisin kylään.
Hän ei tavannut Döbelniä äskeisellä paikalla ja matkaansa jatkaen
hän saapui tienristeykseen. Vasemmalla hänen edessään oli
Filppulan taloryhmä kaksikerroksisine asuinrakennuksineen. Se oli
vielä venäläisten hallussa. Asuinrakennuksen ikkunoista, solista ja
nurkkien takaa satoi kuulia. Ramsayn valtasi samanlainen
huimapäinen hyökkäysinto kuin Siikajoellakin. Miekkansa temmaten
hän asettui paikalle rynnistävän pienen porilaisryhmän etupäähän ja
karautti ohjat löyhinä pihaan.

Mutta jo solalla kirposi miekka hänen kädestään ja hän suistui
nurinniskoin maahan. Sotilaat syöksyivät hänen ohitseen taloon ja
hurjan temmellyksen keskellä Ramsay kieriskeli maassa ankarien
tuskien vallassa, sillä rinnan alle sattunut iso ja rosoinen
musketinkuula oli pahoin raadellut hänen sisälmyksensä. Hetken
kuluttua hän kadotti kokonaan tajuntansa.
Kenraali Rajevski oli Euroopan monilla sotakentillä kunnostautunut,
kylmäverinen ja neuvokas päällikkö. Kun hänen vasen sivustansa oli
karkotettu Isostakylästä ja hänen tykkinsä vaiennettu, hän muodosti
nopeasti uuden rintaman, jonka vasen kärki nojautui Liuhtarlaan,
oikea taas Ritamäen itäpäähän. Tätä uutta rintamaa vastaan
hyökkäsi nyt koko suomalaisarmeija. Venäläiset painuivat yhä
idemmäksi, kohti omaa ilmansuuntaansa, ja illan suussa hävisivät
heidän viimeisetkin joukkonsa Ränkimäellä kasvavan metsän
suojaan. He eivät ehtineet korjata edes haavoittuneitaan, jotka he
olivat kuljettaneet Liuhtarlaan sidottaviksi. Pakoon lähtiessään
kasakat sytyttivät Liuhtarlan talot ja rannalle keväällä kerätyn
tervavaraston. Liekkeihin joutuneiden haavoittuneiden parkuna
kaikui takaa-ajoon syöksyvien suomalaisten korviin. Palavia
tervatynnyreitä vierähteli jokeen ja pian näytti koko virtakin olevan
liekkien vallassa.
Tuntiessaan jonkun kohottavan hänen päätään Ramsay tuli vielä
kerran tuntoihinsa. Hänen ylitseen kumartuneena oli luutnantti
Brakel, jonka Döbeln oli lähettänyt adjutanttiaan etsimään.
— Jaksatko nousta, veli, että saatan sinut lääkärin luo? kysyi
Brakel.
— Ei, anna minun olla tässä, ei minulla ole enää monta
silmänräpäystä jäljellä, kuiskasi Ramsay. Sano sen sijaan, kuinka

taistelun on käynyt?
— Vihollinen on lyöty ja pakenee parhaillaan Kuortanetta kohti.
— Hyvä, hyvä! Vie äidilleni viime tervehdykseni ja sano, ettei hän
kovin surisi, sillä minä tunnen tällä haavaa itseni äärettömän
onnelliseksi. Ja niin on varmaan veljenikin tuntenut. Äitini — niin,
hän on uhrannut isänmaalle molemmat poikansa ja isänmaa on
varmasti siunaava hänen muistoaan.
Hänen sanansa heikkenivät soperrukseksi, hetkinen vielä ja hän
ummisti silmänsä ainaiseksi.
Kun kesäyön hämy verhosi tienoon ja Simsiön päällä helotti valju
kuun puolikas, oli vainioille, missä kuolo oli porilaisten joukosta
korjannut runsaimman saaliin, kaivettu kaksi hautaa, iso ja pieni.
Edelliseen sijoitettiin ne satakuusi suomalaista soturia, jotka Lapuan
valloitus oli vaatinut uhrikseen. Toiseen laskettiin lepäämään
rinnatusten ystävykset Ramsay ja Qvanten sekä kolme muuta
kaatunutta upseeria, nimittäin luutnantit Blume ja Gestrin sekä
kapteeni Aminoff. Venäläisten nelisensataa kaatunutta lojui vielä
hajallaan ympäri taistelualuetta.
Päällikkökunnan hyvästellessä kaatuneita urhoja kirjoitti nuori
luutnantti Montgomery, joka myöhemmin tuli tunnetuksi Suomen
sodan ensimmäisenä historioitsijana, päiväkirjaansa sanat: "Nuori
Ramsay kuoli yleisesti kaivattuna urhoollisuutensa, kuntonsa ja
isänmaallisen mielensä tähden ja hänen hautansa taistelutantereella
kastui kaikkien urhoollisten kyynelistä."
Heinäkuisen yön autereisessa hämyssä, virren sävelten kaikuessa,
ryhtyivät paikkakunnan miehet peittämään hautoja, joista kerran oli

ylenevä kaunis sato — hautoja, joiden äärellä satasen vuotta
myöhemmin sytytettiin se vapauden soihtu, mikä esi-isäin taistelut,
unelmat ja aavistukset muutti todellisuudeksi ja teki tästä maasta
itsenäisen Suomen valtakunnan.
Kyösti Wilkuna

SUOMALAINEN SOTAMIES
PAAVO RAPP
Paavo Hiskianpoika Kekäläisenä hän oli Lapinlahden Pörsänmäellä
tähän maailmaan ilmestynyt, mutta kun hän tarjoutui edesmenneen
Juho Kranaatin tilalle ruotusotilaaksi Kuopion komppaniaan, ristivät
herrat tarjouksen hyväksyessään hänet Rappiksi — siihen aikaan kun
kaiken, mikä joutui lähempään kosketukseen korkean kruunun
kanssa, piti esiintyä ruotsiksi puleerattuna. Sellaisenkin savolaisen
mullikan kuin Paavo Hiskianpoika Kekäläisen. Tuohon Rapp-nimeen
toverit ja naapurit ja yleensä kaikki suomea haastavat kruunun
alamaiset tietysti kiireimmiten liittivät yhden äänteen lisää, niin että
se sai säällisemmän muodon Rappi. Ja sitten tietysti toverit ja
tuttavat huusivat hänelle aina tavatessaan: "Terve, rappi!" mistä taas
oli mainion mukava kehitellä leikinlaskua edelleen, varsinkin kun
asianomainen itse autteli voimiensa mukaan.
Kuten sanottu, Rappi oli oikea savolainen mullikka, sitkeä,
hätäilemätön ja perin juurin hyvänahkainen. Häntä sai kaltata ja
vanuttaa kuinka hyvänsä, mutta silti hän aina pysyi samana
hyväntuulisena jässäkkänä. Suuttumisen taito puuttui häneltä

luultavasti kokonaan. Ainakaan ei kukaan muistanut häntä koskaan
nähneensä raivopäisenä.
Hän oli keskikokoinen, hartiakas ja pyöreänomainen. Pää, kasvot
ja vartalo, kaikki oli hänessä pyöreätä. Ja hyvässä lihassa hän pysyi
aina. Silloin kun oli ruokaa, hän söi tavattomasti, mutta ruoan
puutteessa voi olla syömättäkin vaikka päiväkausia, ilman että hänen
pyöreä naamataulunsa siitä kävi ryppyiseksi tai että hänessä alkoi
ilmetä pahantuulen merkkejä. Rakasta lehtimälliään hän vain
käänteli silloin poskessaan sitä ahkerammin. Lämpimästä hän piti
tavattomasti. Sydäntalven kylmät kuukaudet, jolloin ei ollut
sanottavia tehtäviä, hän vietti mieluimmin uuninpankolla, vedellen
unia aamusta iltaan ja illasta aamuun. Mutta milloin pakko ajoi
pakkasen kouriin, ei hän juuri hytissyt, vaan oli ja liikuskeli verkkaan
kuin kotipirtin lämpimässä.
Hän oli jo lähellä kolmeakymmentä saadessaan edesmenneen
Kranaatin paikan Savon jalkaväen Kuopion komppaniassa. Ylleen hän
sai komean kruunun asun kaluunoineen, rensseleineen ja korkeine
koppahattuineen sekä olalleen piilukkomusketin huikean pitkine
pistimineen. Tätä juhlallista asua käytettiin kuitenkin vain kesäisissä
harjoituksissa Kuopiossa. Väliajat, paitsi juhlapäivinä, hän oli (se on
makaili) vanhaan kotikuosiin verhoutuneena. Kaikki sotamiehen
ammattiin kuuluvat temput ja äksiisit hän oppi ilman pahempia
hikoiluja, tarvitsematta juuri kertaakaan tehdä tuttavuutta vääpelin
pampun kanssa, sillä päänupin puolesta hän oli joltinenkin. Olihan
näet äitimuorikin aikoinaan ollut kyläkunnan parhaita lukuihmisiä:
osasi katkismuksensa kannesta kanteen kuin vettä valaen.
Ampujana Paavo Rappi oli komppaniansa ensimmäinen.
Lapinlahtelaiset levittivät sellaista juttua, että Rapin Paavo ampui

kymmenen laukausta yhteen ja samaan kuulanreikään. Kuinka tuon
asian laita sitten oikeastaan lie ollut, sillä jalkaväen suurireikäiset ja
sileäpiippuiset musketit olivat kaikkea muuta kuin tarkkoja, mutta
niin ainakin lapinlahtelaiset kehuivat iisalmelaisille ja maaninkalaisille,
milloin he tunsivat tarvetta ylvästellä oman pitäjänsä etuisuuksilla
naapurien edessä. Mutta saattoi puheessa olla perääkin, sillä kun
näki, miten hätäilemättä Rapp asetti pyssynperän poskelleen, näpisti
mällin liikkumattomaksi poskeen ja tähtäsi, uskoi mielellään, että se
mies ei ammu harhaan, jos ase suunnilleenkaan on kutinsa pitävä.
Sotamiehen oikeuksien ja velvollisuuksien mukana Rappi sai
asuttavakseen asianomaisen sotilastorpan siihen liittyvine
verosaatavineen. Siihen aikaan hän oli vielä naimaton mies, niin että
emännyydestä sai äitimuori ruveta pitämään huolta. Mutta kun muori
poikansa sotamiehyyden toisena vuotena äkkiarvaamatta jätti tämän
maailman, täytyi Paavon ruveta oikein tosissaan emäntää
katselemaan. Eikä siinä suurta vaivaa ollutkaan, sillä tulijoita olisi
ollut vaikka joka sormelle ottaa. Ei siis muuta kuin valita mieleisin
joukosta. Ja Paavo valitsikin Maijan, joka oli kaikin puolin yhtä
puhdas rotuihminen kuin hän itsekin.
Kappaleen kolmatta vuotta he elelivät kaikessa rauhassa, Paavon
marssiessa kesäisin äksiiseissä ja talvisin kuorsatessa uunin päällä.
Heillä oli jo kävelemistä aloitteleva poika ja toinen pian tulossa. Se
tulikin eräänä helmikuun aamuyönä, juuri kun Paavo tavallisella
lempipaikallaan kuorsasi makeimmassa aamu-unessa. Kun Maija
suurella vaivalla sai hänet hereille, hän kuuli ihmisalokkaan jo
kitisevän vuoteella.
— Pojallako taas nakkasit? hän kysyi haukotellen ja päätään
kynsien.

— Ka, eipä tässä nyt tyttöjä keskitalvella, vastasi Maija.
— Tuota, kävisinköhän naapurin Lienaa tiedustelemassa tänne, jos
niin kuin lapsenämmää tarvitsisit? kysyi Paavo saatuaan tarpeekseen
haukotella.
— Mitä tuhatta tässä lapsenämmillä tehdään, arveli eukko. —
Äidillänikin oli puoliväliin toistakymmentä tenavaa eikä hän
kertaakaan ollut tarvinnut apuihmistä. Melkein seisovilta jaloin kehui
useimmat laittaneensa.
Paavo kohentautui uunilta alas ja ryhtyi auttelemaan eukkoa, jotta
äsken tullut saatiin pestyksi ja kapaloihin ja jotta elukat siinä ohella
tulivat ruokituiksi. Kun pienokainen oli sijoitettu pärekoppaan
ottamaan ensimmäisiä uniaan, kuului nurkan takaa suksensuihketta
ja kohta sen jälkeen astui huurupilven seuraamana sisälle mies, joka
hyvät huomenet toivotettuaan muitta mutkitta ojensi Paavolle
arpakapulan. Sota oli syttynyt ja jokaisen armeijaan kuuluvan oli
hetkeäkään hukkaamatta riennettävä asianomaiseen
kokoontumispaikkaan.
— Herra siunatkoon! kuului Maija-emännän huulilta hiljainen
huudahdus, mutta Paavo käänteli ääneti mälliään ja kynsi
korvallistaan, kunnes vasta viestintuojan hankkiutuessa jatkamaan
matkaa lausahti:
— Katohan ruojaa sitä ryssää, kun ei malttanna oottaa niin kauan,
että olisi ehitty tuolle poikaviikarille nimi toimittaa.
— Mikäs tässä meille sitten neuvoksi tulee? päivitteli Maija vesissä
silmin.

— Ka, mikähän teillä on hätänä täällä lämpöisessä pirtissä. Suuhun
panemista on ja pesään panemista niinikään, lohdutteli Paavo.
— No niin, niin, kyllähän me, mutta entäs sinä poloinen, joka
joudut sinne sodan pauhuun. Tokko elävin silmin enää
nähtäneekään.
— Mikseipä vielä nähtäisi. Ole sinä vain huoleti, kyllä minä takaisin
tulen, jahka vihollinen on sysätty rajan taakse.
Näin eukkoa lohdutellen Paavo ryhtyi verkalleen lähtöä
hommaamaan, muutti päälleen kruunun tamineet, työnsi poveensa
vankan käärön tupakanlehtiä ja puhdisti aseensa. Eukko haki
kätköistään sukkia ja vanttuita sekä työnsi rensseliin eväiksi paksun
limpun, voirasian ja aikamoisen lihankimpaleen.
— Kyllä kai siellä saa paastota jos palellakin, puheli hän sitä
tehdessään, — ja hyvä jos sittenkään hengissä pääsee.
— Sehän kuuluu vähän niin kuin ammattiin, se paastoaminen ja
paleleminen — ja hengestäänkin pääseminen, jos oikein lujille ottaa,
arveli Paavo, — mutta mitäpä tässä nyt turhia edeltäpäin
vesittelemään. Ties vielä, kuinka herroiksi siellä pidetään.
Seurasi sitten eronhetki. Ei siinä liikoja tunteiltu. Pistettiinhän kättä
toisilleen ja sekin tapahtui hieman kuin varkain. Ovelle mennessään
Paavo vielä toimitti:
— Katohan torpan perään ja… ja sitten kun minä palaan,
lämmitetään sauna ja ruvetaan elämään kuin ennenkin.
Kaikesta päättäen hänellä oli mielessä jotakin juhlallisempaa
lähtösanoiksi, mutta mikä siinä lie kangertanut, että esille tuli vain

tuo sauna-asia. Sen jälkeen hän työntyikin jo pyssyineen ja muine
kantamuksineen ovesta ulos sekä painui taipaleelle.
Kun komppania oli saatu Kuopiossa täysilukuiseksi, lähdettiin
viivyttelemättä hevoskyydillä Mikkeliin. Sinne virtasi miehiä ja
hevosia joka ilmansuunnalta, niin ettei Rappi ollut Kuopion
markkinoillakaan nähnyt niin paljon väkeä koolla. Yöt täytyi maata
pitkin lattioita niin ahtaalla kuin silakat tynnyrissä ja päivisin pidettiin
harjoituksia tai seistiin vahdissa. Vihollisen sanottiin olevan jo rajan
tällä puolen, mutta vilaustakaan siitä ei vielä ollut nähty.
Talvi oli ylen tuima ja useina päivinä pakkanen lähenteli
neljääkymmentä astetta. Piti siinä tarjeta, kun suurella osalla
sotilaita oli varsin puutteelliset päällystamineet. Alkoipa sitten eräänä
päivänä helmikuun lopulla kierrellä huhu, että vihollinen on tuossa
tuokiossa Mikkelin edustalla. Siitäkös Cronstedt hätääntyi ja niin sai
koko prikaati seisoa taisteluvalmiina pitkän talvisen yön tuollaisessa
tulipalopakkasessa. Se oli yksi niitä kohtalokkaita laiminlyöntejä,
joihin ylempi päällystö varsinkin tiedustelutoiminnan osalta usein
tämän sodan aikana syyllistyi. Venäläisiä ei näkynyt eikä kuulunut,
mutta seuraukset siitä, että prikaati lähes neljänkymmenen asteen
pakkasessa sai koko yön seistä aseissa, tulivat seuraavana päivänä
näkyviin. Satakunta miestä oli paleltunut niin pahoin, että heidät
täytyi lähettää sairastupaan. Ja lisäksi hyvin monet olivat
palelluttaneet kuka korvansa, kuka varpaansa.
— Toinen korva meni, sanoi Rappi vieruskumppanilleen, — mutta
onhan varaa mennäkin, kun kotona on kokonaista kuusi korvaa
reservissä.
Kohta sen jälkeen lähdettiin, vaikka vihollista ei ollut nähtykään,
perääntymään Pieksämäelle, josta Cronstedtin saamiensa ohjeiden

mukaan oli jatkettava matkaa Kuopion ja Iisalmen kautta Ouluun. Se
oli ylen vaivalloista matkantekoa tykistön ja suurehkon kuormaston
kanssa, sillä lunta oli kaikkialla vahvasti ja pakkanen jatkui päivästä
päivään yhtä ankarana. Jokainen koetti suojella itseään miten
parhaiten taisi. Upseerit kulkivat turkeissa ja miehet olivat käärineet
korviensa ympärille mitä suinkin olivat saaneet. Nähtiinpä yhden ja
toisen hartioilla naisen hamekin. Sen vuoksi tarjosi prikaati kinosten
keskellä eteenpäin rämpiessään varsin kirjavan näyn. Leipä ja muu
syötävä jäätyi tietysti kivikovaksi, niin että sitä täytyi nuotion ääressä
sulatella, ennen kuin siihen hampaat pystyivät. Yöt vietettiin kuumiin
savupirtteihin ahtautuneina, milloin satuttiin isompaan kylään, mutta
enimmäkseen saatiin pitkä talviyö viettää taivasalla nuotioiden
ympärillä.
— Väärässäpä oli kuin olikin se Mykkälän vanha vaari, virkkoi
Rappi eräänä päivänä rivitoverilleen.
— Missä asiassa? kysyi toveri kummastuneena.
— No kun se kerran kivenkovaan intti, että maailma ei koskaan
mene eteenpäin, vaan aina taaksepäin. Mutta onpahan entisestään
edistytty tässä sodankäynnissäkin.
— Miten niin edistytty?
— No ka, niinhän nuo vanhat kertovat, että entisissä sodissa
seisottiin vastatusten ja tapeltiin verissäpäin. Mutta nyt marssitaan
vain siivosti peräkanaa. Eikö ole maailma muuttunut parempaan
päin?
Mutta muutama päivä tämän sananvaihdon jälkeen sai Rappi
aiheen epäillä, että Mykkälän vaari ehkä sittenkin oli oikeassa. Hän

sai näet tapella lämpimiinsä asti ja tehdä oikein kädestä pitäen
vihollisen tuttavuutta.
Siinä maaliskuun puolivälissä oli prikaati saapunut Kuopioon, josta
piti hiukan levähdettyä jatkettaman matkaa eteenpäin.
Kolmisatamiehinen joukko, mihin Rappikin kuului, oli kenttävartiossa
Jynkän kylän lähistössä muutama virsta Kuopiosta etelään. Yö oli
vietetty nuotioilla ja kohta päivän valjettua hyökkäsi kenraali
Tutshkov kahdentuhannen miehen kanssa tämän pienen joukon
kimppuun, jota johtivat kapteenit Duncker ja Malm. Siitä kehittyi
viitisen tuntia kestävä kuuma taistelu, ensimmäinen huomattavampi
ottelu itäisellä sotanäyttämöllä. Kerta kerralta tuo pieni joukko löi
vihollisen hyökkäykset takaisin.
— No tämähän jotakin on, lausui Rappi tyytyväisenä työntäen
uutta panosta lämminneen muskettinsa piippuun. — Ei tässä ehdi
kylmäkään tulla.
— Eikä muijaakaan ikävä, lisäsi vieruskumppani.
— No ei totisesti. Ja jos olisi heti siellä Mikkelissä päästy tällaiseen
tosihommaan, niin minullakin kukaties olisi molemmat korvat jäljellä.
Kylmäverisesti nuo kaksi kookasta miestä, Duncker ja Malm,
liikkuivat kuulasateessa sotilaittensa keskellä jaellen käskyjään
kuuluvalla äänellä. Varsinkin Malmilla oli ehtymätön varasto meheviä
sananlaskuja ja sutkauksia, joita hän välillä huuteli sotilailleen.
Elostunut, hilpeä mieliala vallitsi riveissä ja katkeamattoman
paukkeen keskellä kuultiin naurunpurkauksia. Kaikki kävi kuin
talkoissa. Olivat ne miesten miehiä, nuo Duncker ja Malm, samoin
kuin luutnantti Burmankin, pelottomia, kansanomaisia ja suomalaisia

kiireestä kantapäähän. Hätäkös oli sellaisten miesten johdolla tapella
vihollista vastaan.
Vihollisia oli seitsenkertainen ylivoima. Mikäpäs heidän oli silloin
ryhtyä saartoliikkeisiin vaikka kahdeltakin suunnalta. Mutta kun
edessä ja sivuilla oli avonainen jäätikkö ja aurinko paistoi
häikäisevän kirkkaasti, huomattiin vihollisen aikeet ajoissa. Täytyi
ryhtyä perääntymään Kuopion suunnalle. Mutta se kävi hätäilemättä
ja järjestyksessä. Haavoittuneet korjattiin mukaan, ja aina tavan
takaa pysähdyttiin raehaulipanoksilla ja muskettitulella häätämään
kantapäillä tungeksivaa vihollista.
Oltiin jo virstan päässä alkuperäisistä asemista, kun Kuopiosta
saapui prikaatinadjutantti, luutnantti Brusin. Dunckerin luo
ratsastaen hän kysyi korskasti:
— Kuka on herra kapteenille antanut luvan jättää asemat?
Sitä nulkkia! Eikö hän nähnyt, miten täällä olivat asiat?
Kummastuneena Duncker silmäili häntä kiireestä kantapäähän,
viittasi sitten vihollisiin päin ja sanoi:
— Nuo sen tekivät välttämättömäksi.
Virallisesti kuin paraatissa Brusin ilmoitti nyt:
— Saan ilmoittaa, että prikaati on jättänyt Kuopion ja että herra
kapteeni saa pelastaa etuvartion miten parhaiten taitaa.
— Sen aionkin tehdä, vastasi Duncker kylmästi, minkä jälkeen
adjutantti teki kunniaa ja ratsasti takaisin Kuopioon.

Tämän Suomen sodan ensimmäisen huomattavamman taistelun
johdosta jaettiin erinäisiä suosionosoituksia. Kapteeniksi ylennettiin
muun muassa — luutnantti Brusin! Dunckerista, Malmista ja
Burmanista ei mainittu mitään. Heidän kunnioittamisestaan piti
huolen — kenraali Tutshkov. Hän kutsui taistelun jälkeen upseerinsa
koolle ja piti heille luennon siitä, kuinka taitavasti ja kylmäverisesti
peräytyminen on suoritettava. Hän piti esimerkillisenä Dunckerin
johtamaa suomalaisen etuvartioston vetäytymistä.
Brusinin lähdettyä jatkettiin tuota taistellen perääntymistä. Lunta
oli vahvalti ja liikehtiminen oli työlästä, varsinkin kun mukana täytyi
laahata paria kanuunaakin. Vihollinen seurasi itsepintaisesti
kintereillä ja kasakat uudistivat tavan takaa hyökkäyksensä.
Oli taas pysähdytty rintamaan parin pienen saaren edustalle.
Tuimalla muskettitulella vihollinen karkotettiin ampumamatkan
ulkopuolelle ja Duncker viestitti juuri pitkin linjaa käskyn matkan
jatkamisesta.
Rappi oli laskenut kuumenneen muskettinsa hangelle jäähtymään
ja noussut itse edessä olevan kinoksen päälle nähdäkseen paremmin
ympärilleen. Hän oli itsekin lämmennyt, otti lakin päästään ja kuivasi
hikeä kasvoiltaan. Ampuessaan hän oli siinä määrin tuohtunut, että
oli pureskellut mällinsä rikki ja syljeksinyt sen pikku hiutaleina
suustaan. Siitä aiheutunut tyhjyyden tunne oli mitä kiireimmin
poistettava. Hän otti tupakanlehtikäärön taskustaan ja käänteli sitä
käsissään päästäkseen selville, mistä kohtaa olisi mukavin haukata.
Siinä puuhassa hän ei tietysti mitenkään joutanut huomaamaan,
kuinka vihollinen oli ajattanut esille muutamia haupitseja
murtaakseen niillä aukkoja suomalaisten rintamaan. Ensimmäinen
niistä jo jyrähti, ja kirkkaalla taivaalla näkyi kaartuva viiru, jonka

suunta oli juuri sitä kinosta kohti, minkä päällä Rappi seisoi. Eri
suunnilta kuului varoitushuutoja, mutta Rappi oli siinä määrin
syventynyt uuden mällin laatimiseen, ettei hän niitä huomannut.
Juuri kun hän työnsi lehtikäärön takaisin taskuun, pudota tömähti
vonkuen kiitävä haupitsinpanos hänen jalkojensa juureen, kaivautui
kinokseen ja pelmautti ilmoille kokonaisen lumivyöryn. Rappi tunsi
putoavansa alas kaatuen samassa selälleen ja peittyen ryöppyävään
lumeen.
Hän makasi muutaman hetken liikkumatta, jäsenissään omituinen
herpaantuneisuus. Ensimmäiseksi alkoivat ajatukset liikkua.
— Katohan pakanaa, kun pyyhkäisi jalat altani! hän virkkoi
itsekseen.
Hän oli varma siitä, että kanuunankuula oli katkaissut hänen
jalkansa polvia myöten. Siksi hän oli pudonnut polven mitan
alemmaksi ja kaatunut.
Mutta olipa ihme, ettei jalkoja sen pahemmin kivistänyt. Verta
niistä kuitenkin mahtoi vuotaa aivan tuhottomasti. Hän koetti
varovasti liikutella jalantynkiään, mutta kivistystä ei vain tuntunut.
Olipa se merkillistä.
— Se tuo sotamiehen ruumis näkyy tottuvan mihin hyvänsä, arveli
hän itsekseen, — ja sitä vartenpa ne äksiisit ovatkin.
Hiukan totuttuaan ajatukseen, että hän nyt oli jalaton mies, hänen
teki mieli myöskin silmillään todeta tämä uusi asiaintila. Varovasti
hän kohotti jalantynkiään, kunnes ne muuhun ruumiiseen nähden
muodostivat suoran kulman.

— No saamari! hän ihmeissään huudahti nähdessään jalat
saappaineen päivineen aivan ennallaan.
Valehtelivatko hänen silmänsä vai oliko tässä noituus matkassa?
Hän tunnusteli käsin polviaan ja pohkeitaan sekä hakkasi saappaita
toisiaan vasten. Ei pienintäkään kipua tuntunut. Hänelle alkoi juuri
selvitä, että hän oli vain polviaan myöten pudonnut kanuunankuulan
kaivamaan käytävään, kun hän samalla kuuli naurunrähäkkää aivan
läheltään.
Hän kapsahti seisaalleen muistamatta epäillä sen enempää
jalkojansa, ja näki edessään joukon kasakoita. Nämäpä olivat iloisen
naurunrähäkän päästäneet nähdessään kinoksesta pistävän esiin
miehen jalat, jotka sätkyivät kuin heitä luokseen viittoen. Toveriensa
Rappi näki marssivan jo pyssynkantaman ulkopuolella.
Ensi ällistyksestä toinnuttuaan hän tempasi musketin käteensä ja
yritti loikata toveriensa jälkeen. Mutta siinä samassa ympäröivät
hänet kasakat, jotka nauraa hohottivat hänelle vasten silmiä.
— Kyllä minä opetan teidät räkättämään! sanoi Rappi ja alkoi
huitoa ympärilleen.
Hän sai pari lievää piikinpistoa ja tehtiin siinä tuokiossa
aseettomaksi. Sitten hän sai marssia rintaman taakse sekä katsoa
päältä, kuinka venäläiset ahdistelivat hänen poistuvia tovereitaan.
— Saamari sentään! pääsi häneltä jälleen ja harmissaan hän raapi
korvallistaan. — Oli se sentään sikamaista, että hänen juuri piti
ensimmäisenä joutua vangiksi. Mitähän siitä Lapinlahdellakin
sanottaneen?

Häntä vartioi parrakas kasakka, joka ei ollut mikään
koirankuonolainen, vaan hyväntahtoinen vanha starikka, joka omalla
kielellään lohdutteli vankiaan ja tarjosi hänelle tupakkaa. Iltapuolella
lakkasi taistelu, kun Duncker joukkoineen oli onnellisesti päässyt
Toivolaan, jossa hän yhtyi muuhun prikaatiin. Venäläiset asettuivat
suojattomaksi jätettyyn Kuopioon.
Siellä Rappi huomasi, ettei hän toki ollut ensimmäinen vangiksi
joutunut suomalainen. Niitä oli matkan varrella jälkijoukosta napattu
jo useita kymmeniä, ja illalla heidät teljettiin Kuopiossa erään
kasakkain miehittämän talon saunaan.
Seuraavana aamuna vietiin Rappi kuulusteltavaksi. Muuan
esikuntaupseeri koetti tulkin välityksellä urkkia häneltä kaikenlaisia
tietoja Cronstedtin armeijaosaston miesluvusta, aselajeista ym.
Rappi puri mälliään ja päätti olla mitään puhumatta. Mutta sitten
johtui hänen mieleensä syöttää heille ajankulukseen pajuköyttä,
kuten hän myöhemmin kertoi. Niinpä hän ilmoitti Cronstedtin
komennossa hänen tietämänsä mukaan olevan
kaksikymmentätuhatta miestä ja kanuunoita hän oli omin silmin
laskenut sataseitsemän kappaletta, vaikka niitäkin luultavasti oli,
kuten miehiäkin, tosiasiassa toista vertaa enemmän. Upseeri suuttui
hänen jutuistaan, iski nyrkkinsä pöytään ja käski viedä tuon
suurvalehtelijan hiiteen. Niin saatettiin Rappi takaisin saunaan
kohtalotoveriensa luo. Iltahämärissä, juuri kun vangeille jaettiin
hiukan leipää, pantiin kaupungilla toimeen hälytys ja jostakin kuului
ampumisen pauketta. Varmaankin hyökkäsivät suomalaiset takaisin
kaupunkiin ja vangeissa heräsi pikaisen vapautumisen toivo.
Kun leivänjakaja oli poistunut, Rappi tunnusteli ovea ja huomasi
sen ihmeekseen aukeavan. Pihalla ei näkynyt ketään, ainoastaan

portilla seisoi pari kasakkaa selin saunaan. Rappi pujahti ulos ja hiipi
halkovajan suojaan. Vartija palasi saunan luo ja telkesi oven, ennen
kuin Rapin toverit olivat ehtineet rohkaista mielensä ja seurata
hänen esimerkkiään.
Ampuminen kaupungilla taukosi. Venäläisten oma
tiedusteluretkeltä palaava joukko oli ollut syynä hälytykseen. Mutta
Rappi oli kuin olikin päässyt loukusta, vaikka olikin vielä keskellä
vihollisen miehittämää pikku kaupunkia. Takasolia ja ulkohuoneiden
kattoja hyväkseen käyttäen hän loittoni nopeasti vankeuspaikastaan.
Pimeän lisäksi puhkesi iltayöstä sakea lumipyry. Sen turvin hän pääsi
kaupungista. Metsä ei ollut kaukana ja sinne päästyään hän arveli jo
olevansa täysin turvassa.
Aamusella hän sai eräästä torpasta sukset alleen ja illan suussa
hän ilmestyi sotamiestorppansa pihalle Lapinlahdella. Maija ihan
kiljasi, kun hän työntyi pirttiin. Ja oliko se ihme, sillä edellisen illan ja
tämän päivän hän oli kuolleeksi luulemaansa miestä itkenyt. Eilen oli
näet Savon armeija marssinut Lapinlahden läpi ja Maija oli tietysti
monet eväät matkassaan rientänyt heidän levähdyspaikkaansa. Siellä
olivat Paavon komppaniatoverit sitten kertoneet asian. Kallaveden
jäällä oli tapeltu tuimasti ja sinne oli Rappi jäänyt monen muun kelpo
toverinsa kanssa. Monet miehet olivat omin silmin nähneet, kuinka
kanuunankuula oli sattunut Rappiin ja hän ääntä päästämättä oli
kaatunut hangelle.
Niin että oikeinko se nyt todella oli hänen oma Paavonsa tuo
pirttiin ilmestynyt sotamies?
— Ka, kukahan minä nyt sitten muukaan olisin? arveli Rappi
rauhallisesti, astui peremmäksi ja levitti märät käsineensä

muurinolalle kuivamaan. — Oikeinpa hikosin hiihtäessäni. Pitääpä
pistää sauna lämpiämään.
No, ei ainakaan tuo mikään kummitus ollut — mies, joka puri
mälliä ja puhui saunan lämmittämisestä.
— Mutta miten ihmeessä sinä sitten elossa olet? puhkesi Maija, —
kun sanoivat oikein kanuunankuulan sinuun käyneen?
— Ka, eihän se kanuunankuula muuta kuin jalat altani pyyhkäsi.
— Jalat altasi pyyhkäsi, ja Maija alkoi tarkastella hänen jalkojaan.
— Mitä katsot? kysyi Rappi vihdoin, — vai luuletko, että minä
lainajaloilla liikun? Totta kai ainakin nämä saappaat tunnet.
Tuossahan on tuo paikkakin, jonka joulun edellä siihen pistin.
Tultuaan viimeinkin vakuuttuneeksi miehensä ruumiillisesta
olemassaolosta Maija joutui sellaisen riemun valtaan, että oikein
syleilemään rupesi. Ihan oli Rappi mällinsä pudottaa, sillä sellaista
ihmettä heillä ei ollut koskaan ennen tapahtunut.
Oli se löyly, jonka Rappi sinä iltana saunassaan otti saadessaan nyt
viimeinkin kylpeä monen viikon edestä. Lopuksi hän pyyhki tervaa
kasakanpiikin ruvettuneisiin jälkiin. Ja kyllä hänelle ruokakin maistui,
sillä vankeuspäivät olivat olleet miltei yhtämittaista paastoa.
Seuraavana päivänä hän paahtoi suksensa ja nukkui sitten lähes
kokonaisen vuorokauden. Eipä ollut kiirettä, kyllä hän suksilla pian
saavuttaisi marssivan armeijan. Mutta ei se sentään käynytkään niin
nopeasti. Venäläiset olivat kyllä pitäneet huolen siitä, että Cronstedt
eteni hyvänlaista vauhtia pohjoista kohti. Sitä paitsi täytyi Rapin
käyttää kaikenlaisia mutkittelevia syrjäteitä sekä tehdä väliin

suuriakin kaarroksia välttääkseen vihollisia jotka olivat jo ehtineet
hänen ja prikaatin väliin. Suojailmoilla hän pysähtyi väliin
vuorokausiksi lepäämään tienvarren taloihin, joissa häntä, vihollisen
käsistä pelastunutta omaa sotilasta, hoideltiin kuin parasta vierasta.
Vasta huhtikuun puolivälissä hän eräänä iltana Rantsilassa törmäsi
omiin etuvartijoihin. Saatuaan selville talon, missä hänen oma
komppaniansa majaili, hän sai talon pirttiin työntyessään toverinsa
yhtäläisen ällistyksen valtaan kuin aikaisemmin oman Maijansa.
Puheen sorina taukosi siinä paikassa ja kaikki tuijottivat suu auki
Rappiin. Mutta kun asia oli hiukan selvinnyt, niin sittenkös alkoi
sadella kysymyksiä, ihmettelyjä ja lopuksi tietysti toinen toistaan
mehevämpiä leikinlaskuja, joihin Rappi tavanomaisella
hätäilemättömyydellään vastaili.
Seuraavan päivän kuluessa hänen seikkailunsa tuli leirissä niin
tunnetuksi, että itse Cronstedtkin haetti Rapin puheilleen sekä antoi
hänelle poislähtiessä kokonaisen taalerin tupakkirahoiksi. Mutta pian
saatiin Rantsilan leirissä muuta puheen aihetta. Päämajasta saapui
näet sanantuoja, joka kertoi Siikajoen taistelusta ja vihollisen
tappiosta. Siitäkös ruvettiin hurraamaan, ja uutista juhlittiin monta
päivää. Kuin yhdellä iskulla olivat mielet vapautuneet sen tympeyden
vallasta, mihin yhtämittainen vihollisen edessä juokseminen oli ne
painanut. Vihdoinkin saataisiin tehdä täyskäännös.
Mutta ei kuulunut käskyjä käydä päin vihollista, mihin kaikki
olisivat kuitenkin olleet niin valmiit. Päivä toisensa jälkeen kului,
kaikki oli aivan ennallaan ja mieliin alkoi hiipiä entinen tympeys.
Mutta hiukan toista viikkoa Siikajoen voiton jälkeen syntyi Rantsilan
leirissä elämää ja liikettä. Illan suussa nähtiin joka suunnalta
rientävän sotilasjoukkoja kirkon luo, jonne prikaatin oli käsketty

kokoontua. Oli näet saapunut käsky Adlercreutzilta, että Cronstedtin
tuli seuraavana aamuna varhain hyökätä vihollisen kimppuun
Revonlahdella; Adlercreutz itse kävisi samaan aikaan pienemmällä
joukolla pohjoiselta suunnalta saman vihollisjoukon kimppuun.
Iloisin mielin ja raikuvin lauluin lähdettiin kevätillan hämärässä
marssimaan Paavolaa kohti. Mutta pian taukosivat laulut, kun miehet
saivat hiessä päin rämpiä huonokuntoisia metsäteitä, sillä parhaillaan
vallitsi mitä pahin kelirikko ja lunta oli kuluneena talvena kertynyt
tavallista runsaammin. Eteenpäin kuitenkin mentiin ja koko prikaatia
elähdytti kiihkeä halu käydä päätäpahkaa vihollisen kimppuun niin
pian kuin siihen vain käsiksi päästiin.
— Katsohan, Paavo, tällä kertaa paremmin eteesi, ettei vihollinen
saa taaskin pyyhkäistyksi jalkoja aitasi, varoitti vieruskumppani
Rappia, heidän siinä pimeän päissä eteenpäin tarpoessaan.
— Kai tuo yksikin kerta riitti minun kohdalleni, vastasi Rappi
vakaisesti.
Sydänyön aikaan saavuttiin Paavolan kirkolle, jossa levähdettiin
tunnin verran ja haukattiin eväitä. Sitten taas eteenpäin. Matka kävi
yhä vaivalloisemmaksi kuta lähemmäksi päämäärää saavuttiin.
Varsinkin soiden ylittäminen kysyi voimia, kun miehet saivat usein
vyötäröitä myöten huppuroida lumisohjossa. Mutta kukaan ei
valittanut uupumustaan, vaikka hiki valui virtanaan ja jäsenet
vapisivat ponnistuksista. Niin hitaasti kuin matkanteko tapahtuikin,
eteenpäin mentiin kuitenkin lakkaamatta.
— Tämähän käypi oikein tavallisesta saunomisesta, arveli Rappi,
joka tavantakaa oli työntänyt poskeensa uuden mällin, aivan kuin
olisi siitä saanut uutta voimaa ponnistuksiinsa. Myöhemmän

elämänsä varrella olikin hänellä tapana sanoa, että Revonlahden
tappelu kysyi häneltä kokonaista puoli naulaa tupakkaa.
Päivä alkoi sarastaa, mutta oppaat ilmoittivat Revonlahden kirkolle
olevan vielä melkoisen taipaleen. Sieltäkäsin kuului kanuunan jyrinää
ja etäistä musketinpauketta. Adlercreutz oli siellä pienen joukkonsa
kanssa jo täydessä taistelussa. Uupuneen joukon into kasvoi
kaksinkertaiseksi ja hengähtämättä painallettiin eteenpäin.
Vihdoin kohdattiin vihollisen etuvartio, joka muutamia laukauksia
ammuttuaan lähti kiireesti tiehensä. Seurasi hetken pysähdys ja lyhyt
rukous. Sitten prikaati jakaantui kahdeksi kolonnaksi, joiden tuli
molemmin puolin jokea hyökätä kirkonkylään. Siellä oli ampuminen
jo vaiennut, sillä Adlercreutz oli arvatenkin vetäytynyt takaisin.
Talo talolta hyökättiin tuimassa kuulasateessa eteenpäin. Taistelu
ei ollut monituntinen, mutta sitä kuumempi. Voitto oli
perinpohjainen. Ja sellainen juhlamieli ja voitonhumu vallitsi sinä
iltapäivänä Revonlahden kirkolla, että tuskin Siikajoellakaan oli ollut
toista viikkoa aikaisemmin niin repäisevää.
— No, terve Rappi, sinä olet hengissä ja liikut omilla tolpillasi niin
kuin ennenkin, huusivat illallispuuhissa olevat tuttavat Rapille, kun
hän heidän nuotiolleen astui.
— Miksikäs minä nyt toista kertaa olisin antanut jalkoja altani
lakaista, vastasi Rappi.
— Etkä muutenkaan näytä hikirupea saaneen.
— En tuon enempää, sanoi Rappi näyttäen kahta pistimen läpeä
univormunsa liepeessä. — Pappilan pihaan kun hyökättiin, niin

muuan peijakas kohta ensimmäiseksi rei'itti takkini. Mutta minä kun
samassa hotaisin sitä päähän, niin siihen tulikin semmoinen reikä,
ettei siitä miehestä paikkaamallakaan eläjää tule.
— Sinäpä se taisit siellä pappilan pihassa sitä ryssän kenraaliakin
haavoittaa.
— Kyllähän minä siellä yhden jos toisenkin reiän tein ihmisen
nahkaan, ties vaikka siinä olisi kenraaliinkin sattunut. Muuten siellä
oli sellainen rytäkkä, etten mokomaa ole ennen unissanikaan
kokenut.
Saaliiksi oli monen muun hyvän ohella saatu vihollisen
kuormastoakin. Niinpä saivatkin nyt väsyneet sotilaat syödä itsensä
oikein kylläisiksi. Ja sitten levättiin päiväkaupalla.
— Niinhän tämä on kuin häissä, kehaisi Rappi.
Itse Klingsporkin suvaitsi saapua Revonlahdelle Cronstedtin
osastoa tarkastamaan. Vapunpäivänä, sakeassa lumipyryssä,
vietettiin kiitosjumalanpalvelus, jolloin miehet sydämen pohjasta
veisasivat: "Nyt Herraa hyvää kiittäkää!"
Saman päivän iltana saapui leiriin viisisataa kannua viinaa, jonka
Oulun porvarit muun hyvän ohella olivat lähettäneet Revonlahden
voittajien kestitykseksi. Ja siitäpä syntyi iloinen vapunvietto, jolloin
jokaiselta leirinuotiolta kaikui kevätiltaan iloinen laulunhoilotus.
* * * * *
— Kuorsaavat että maa tärisee, tuumi Rapp astuessaan
kalakantamuksineen savuavalle nuotionjäännökselle, jonka ympärillä
hänen komppaniatovereitaan makasi mikä missäkin asennossa. —

Hei pojat, nouskaahan jo kontillenne, päiväkin on jo tangon
korkeudella.
— Mikäs ihme nyt Rappiin on mennyt, kun muita herättelee, ärisi
yksi miehistä. — Itse pahin unikeko koko joukosta!
— Kävin kalassa, selitti Rappi, — ja sain tuollaisen kantamuksen.
Nouskaahan perkaamaan niitä, niin saadaan tässä oikein herkullinen
murkina. Silkalla leivällä tässä onkin taas saatu toimeen tulla.
Katsokaahan, miten lihavia ahvenen köriläitä.
Tieto maittavasta aamiaisesta sai miehet kohentautumaan ylös.
Haukotellen ja päätään raaputtaen he siinä istuivat ja näyttivät kovin
haluttomilta kaikkeen. Vähitellen he saivat kuitenkin puheen päästä
kiinni, ja Rapin osoittama tavaton aamuvirkeys antoikin jutulle hyvän
aiheen.
— Saadaanpas vain nähdä, miten äijän käy, kun noin hoppuilee,
arveli yksi joukosta. — Pian se taas jalkansa menettää ja joutuu
vihollisen hoteisiin.
Rappi naureskeli ja arveli, ettei hänellä ollut mitään sellaista retkeä
vastaan kuin oli se viimetalvinen. Sai käydä kotona kylpemässä ja
sitten toisten perään hiihdellessään pidettiin häntä joka talossa kuin
pappia.
— Lihonuthan se ruoja olikin sillä matkalla, arvelivat toiset.
He ryhtyivät perkaamaan ahvenia, jotka Rappi oli pyydystänyt
läheisestä Kyyjärven lahdesta. Aamu oli vielä varhainen ja vain
harvoja sotilaita liikuskeli leirialueella. Suurin osa heistä vietti

sääskien takia yönsä ulkona pienten savuavien nuotioiden ääressä.
Ja kyllähän nyt tarkeni, kesä kun oli vehmaimmillaan.
Täällä Kyyjärven rannoilla, Lintulahden kylässä, he olivat jo hyvän
aikaa saaneet makailla. Vaikka olihan täällä äskettäin käyty kaksi
kuuman puoleista tappeluakin. Saatu hiukan verrytellä jäseniä, kuten
Rappi sanoi. Ensi kerralla vihollinen oli ajanut Fieandtin joukkoa
Lintulahdesta, mutta parin päivän päästä oli paikka otettu takaisin ja
tässä sitä nyt taas oltiin.
Revonlahden taistelun jälkeen ei Cronstedtin prikaati ollutkaan
päässyt samoja jälkiä takaisin kotipuoleen, vaan se oli saanut liittyä
pääarmeijaan. Koko toukokuu oli vietetty miltei yhtämittaisessa
toimettomuudessa, niin että armeija oli jälleen joutunut syvän
kyllääntymisen valtaan. Kesäkuussa oli sitten pari
savolaispataljoonaa, joista toiseen Rappikin kuului, lähetetty majuri
Grotenfeltin komennossa avuksi Fieandtille, joka pienoisen joukon
kanssa oli Perhon tienoilla käynyt partiosotaa. Vahvistusta saatuaan
Fieandt oli edennyt tänne Lintulahteen ja ottanut täällä olevan teiden
risteyksen haltuunsa.
Kalat saatiin peratuksi, miehet pujottelivat ne vartaisiin ja alkoivat
paistaa. Vesi kielellä he odottivat niiden kypsymistä. Mutta juuri kun
heidän piti ryhtyä murkinoimaan, tuli hälytys. Metsästä Karstulan
suunnalta, missä oli suomalaisten etuvartio, alkoi äkkiä kuulua
kiivasta ja nopeasti lähenevää ampumista. Samassa alkoivat
leirialueella rummut päristä ja unisia miehiä juoksenteli talojen
välissä.
— Katohan sitä viheliäistä Lastohvia, kun ei anna ihmisille
ruokarauhaa, päivitteli Rappi ja sulloi rensseliinsä kuumia ahvenia. —

Ottakaa, miehet, kalat matkaanne, kyllä ne päivän mittaan
maistuvat.
He riensivät määrätylle paikalleen. Etuvartio saapui jo kylään ja
tuokiossa taistelun pauhina täytti tienoon. Venäläiset rynnistivät
ylivoimaisina kahdelta eri suunnalta Fieandtin asemia vastaan.
Puolisenkymmentä tuntia taisteltiin mitä sisukkaimmin. Silloin
Fieandtin täytyi antaa joukolleen perääntymiskäsky, koska häntä
muuten uhkasi saarroksiin joutuminen. Mutta hänen joukkonsa oli
joutunut jo hajalleen, joten kaikille ei voitu toimittaa
peräytymiskäskyä. Eri komppaniat ja ruodut saivat niin ollen
menetellä oman päänsä mukaan.
Keskellä kuuminta tiimellystä ja sakeata ruudinsavua Rappi
huomasi yhtäkkiä, että hän oli kymmenen toverinsa kanssa joka
puolelta vihollisten ympäröimä. Heille huudettiin
antautumiskehotuksia.
— Kehno teille antautukoon! ärjäsi korpraali, joka oli heidän
johtajanaan.
— Hurraa, pojat! ja pistimet sojossa he hyökkäsivät sille suunnalle,
missä vihollismuuri näytti ohuimmalta.
He olivat kirjavanaan kuhmuja, sinelmiä ja pieniä verihaavoja
päästessään vihollisten keskeltä erääseen ruispeltoon, josta he
jatkoivat matkaa läheiseen metsään. Joukko vihollisia seurasi
kintereillä ja kuulat viuhuivat ympärillä, kun he porhalsivat
eteenpäin. Kun vainoojista ei enää kuulunut mitään, he vaipuivat
uupuneina sammalmättäille erään eteensä osuneen tien varressa ja
alkoivat tarkastella haavojaan.