Fixed-Huffman blocks use one table baked into the spec, defined entirely by a fixed pattern of code lengths. Today you build that literal/length table so the next lesson can decode a fixed block.
Build the fixed literal/length Huffman table from its specified code-length ranges.
A fixed-Huffman block skips transmitting any table - it uses one the spec fixes forever, so decoder and encoder agree without exchanging anything. That table is defined purely as a pattern of code lengths across the 288 literal/length symbols: 8 bits for the common literals 0 to 143, 9 for the rarer 144 to 255, a short 7 for the low control symbols 256 to 279, and 8 for 280 to 287. Feed those lengths to the assignCodes you already built and the codes fall out.
The two anchors to pin are the ones you will lean on constantly: literal byte 0 becomes 00110000 and the end-of-block symbol 256 becomes the short 0000000. Symbol 256 is special - it is not a byte, it is the marker that ends the block, which is why it gets one of the shortest codes. With this table in hand, a whole class of real DEFLATE streams becomes decodable, starting with plain literals next lesson.
// build a length array of 288 entries per the ranges, then reuse assignCodes.func fixedLitLenTable() HuffTable {lengths := make([]int, 288)// 0..143 -> 8, 144..255 -> 9, 256..279 -> 7, 280..287 -> 8}