diff --git a/README.md b/README.md
index f870665..d838b0c 100644
--- a/README.md
+++ b/README.md
@@ -16,88 +16,89 @@
 -----------
 
 Create or open a database:
-
-	db, err := leveldb.OpenFile("path/to/db", nil)
-	...
-	defer db.Close()
-	...
-
+```go
+db, err := leveldb.OpenFile("path/to/db", nil)
+...
+defer db.Close()
+...
+```
 Read or modify the database content:
-
-	// Remember that the contents of the returned slice should not be modified.
-	data, err := db.Get([]byte("key"), nil)
-	...
-	err = db.Put([]byte("key"), []byte("value"), nil)
-	...
-	err = db.Delete([]byte("key"), nil)
-	...
+```go
+// Remember that the contents of the returned slice should not be modified.
+data, err := db.Get([]byte("key"), nil)
+...
+err = db.Put([]byte("key"), []byte("value"), nil)
+...
+err = db.Delete([]byte("key"), nil)
+...
+```
 
 Iterate over database content:
-
-	iter := db.NewIterator(nil, nil)
-	for iter.Next() {
-		// Remember that the contents of the returned slice should not be modified, and
-		// only valid until the next call to Next.
-		key := iter.Key()
-		value := iter.Value()
-		...
-	}
-	iter.Release()
-	err = iter.Error()
+```go
+iter := db.NewIterator(nil, nil)
+for iter.Next() {
+	// Remember that the contents of the returned slice should not be modified, and
+	// only valid until the next call to Next.
+	key := iter.Key()
+	value := iter.Value()
 	...
-
+}
+iter.Release()
+err = iter.Error()
+...
+```
 Seek-then-Iterate:
-
-	iter := db.NewIterator(nil, nil)
-	for ok := iter.Seek(key); ok; ok = iter.Next() {
-		// Use key/value.
-		...
-	}
-	iter.Release()
-	err = iter.Error()
+```go
+iter := db.NewIterator(nil, nil)
+for ok := iter.Seek(key); ok; ok = iter.Next() {
+	// Use key/value.
 	...
-
+}
+iter.Release()
+err = iter.Error()
+...
+```
 Iterate over subset of database content:
-
-	iter := db.NewIterator(&util.Range{Start: []byte("foo"), Limit: []byte("xoo")}, nil)
-	for iter.Next() {
-		// Use key/value.
-		...
-	}
-	iter.Release()
-	err = iter.Error()
+```go
+iter := db.NewIterator(&util.Range{Start: []byte("foo"), Limit: []byte("xoo")}, nil)
+for iter.Next() {
+	// Use key/value.
 	...
-
+}
+iter.Release()
+err = iter.Error()
+...
+```
 Iterate over subset of database content with a particular prefix:
-
-	iter := db.NewIterator(util.BytesPrefix([]byte("foo-")), nil)
-	for iter.Next() {
-		// Use key/value.
-		...
-	}
-	iter.Release()
-	err = iter.Error()
+```go
+iter := db.NewIterator(util.BytesPrefix([]byte("foo-")), nil)
+for iter.Next() {
+	// Use key/value.
 	...
-
+}
+iter.Release()
+err = iter.Error()
+...
+```
 Batch writes:
-
-	batch := new(leveldb.Batch)
-	batch.Put([]byte("foo"), []byte("value"))
-	batch.Put([]byte("bar"), []byte("another value"))
-	batch.Delete([]byte("baz"))
-	err = db.Write(batch, nil)
-	...
-
+```go
+batch := new(leveldb.Batch)
+batch.Put([]byte("foo"), []byte("value"))
+batch.Put([]byte("bar"), []byte("another value"))
+batch.Delete([]byte("baz"))
+err = db.Write(batch, nil)
+...
+```
 Use bloom filter:
-
-	o := &opt.Options{
-		Filter: filter.NewBloomFilter(10),
-	}
-	db, err := leveldb.OpenFile("path/to/db", o)
-	...
-	defer db.Close()
-	...
-
+```go
+o := &opt.Options{
+	Filter: filter.NewBloomFilter(10),
+}
+db, err := leveldb.OpenFile("path/to/db", o)
+...
+defer db.Close()
+...
+```
 Documentation
 -----------
 
