============================================
Int literals
============================================

package main

const (
  i1 = 42
  i2 = 4_2
  i3 = 0600
  i4 = 0_600
  i5 = 0o600
  i6 = 0O600
  i7 = 0xBadFace
  i8 = 0xBad_Face
  i9 = 0x_67_7a_2f_cc_40_c6
  i10 = 170141183460469231731687303715884105727
  i11 = 170_141183_460469_231731_687303_715884_105727
)

---

(source_file
  (package_clause (package_identifier))
  (const_declaration
    (const_spec (identifier) (expression_list (int_literal)))
    (const_spec (identifier) (expression_list (int_literal)))
    (const_spec (identifier) (expression_list (int_literal)))
    (const_spec (identifier) (expression_list (int_literal)))
    (const_spec (identifier) (expression_list (int_literal)))
    (const_spec (identifier) (expression_list (int_literal)))
    (const_spec (identifier) (expression_list (int_literal)))
    (const_spec (identifier) (expression_list (int_literal)))
    (const_spec (identifier) (expression_list (int_literal)))
    (const_spec (identifier) (expression_list (int_literal)))
    (const_spec (identifier) (expression_list (int_literal)))))

============================================
Float literals
============================================

package main

const (
  f1 = 0.
  f2 = 72.40
  f3 = 072.40
  f4 = 2.71828
  f5 = 1.e+0
  f6 = 6.67428e-11
  f7 = 1E6
  f8 = .25
  f9 = .12345E+5
  f10 = 1_5.
  f11 = 0.15e+0_2
  f12 = 0x1p-2
  f13 = 0x2.p10
  f14 = 0x1.Fp+0
  f15 = 0X.8p-0
  f16 = 0X_1FFFP-16
)

---

(source_file
  (package_clause (package_identifier))
  (const_declaration
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))
    (const_spec (identifier) (expression_list (float_literal)))))

============================================
Rune literals
============================================

package main

const (
  a = '0'
  b = '\''
  c = '\\'
  c = '\n'
  c = '\u0000'
  c = '\U01234567'
)

---

(source_file
  (package_clause (package_identifier))
  (const_declaration
    (const_spec (identifier) (expression_list (rune_literal)))
    (const_spec (identifier) (expression_list (rune_literal)))
    (const_spec (identifier) (expression_list (rune_literal)))
    (const_spec (identifier) (expression_list (rune_literal)))
    (const_spec (identifier) (expression_list (rune_literal)))
    (const_spec (identifier) (expression_list (rune_literal)))))

============================================
Imaginary literals
============================================

package main

const (
  a = 0i
  b = 0123i
  c = 0o123i
  d = 0xabci
  e = 0.i
  f = 2.71828i
  g = 1.e+0i
  h = 6.67428e-11i
  i = 1E6i
  j = .25i
  k = .12345E+5i
  l = 0x1p-2i
)

---

(source_file
  (package_clause (package_identifier))
  (const_declaration
    (const_spec (identifier) (expression_list (imaginary_literal)))
    (const_spec (identifier) (expression_list (imaginary_literal)))
    (const_spec (identifier) (expression_list (imaginary_literal)))
    (const_spec (identifier) (expression_list (imaginary_literal)))
    (const_spec (identifier) (expression_list (imaginary_literal)))
    (const_spec (identifier) (expression_list (imaginary_literal)))
    (const_spec (identifier) (expression_list (imaginary_literal)))
    (const_spec (identifier) (expression_list (imaginary_literal)))
    (const_spec (identifier) (expression_list (imaginary_literal)))
    (const_spec (identifier) (expression_list (imaginary_literal)))
    (const_spec (identifier) (expression_list (imaginary_literal)))
    (const_spec (identifier) (expression_list (imaginary_literal)))))

============================================
String literals
============================================

package main

const (
  a = "0"
  b = "`\"`"
  c = "\x0c"
)

---

(source_file
  (package_clause (package_identifier))
  (const_declaration
    (const_spec (identifier) (expression_list (interpreted_string_literal)))
    (const_spec (identifier) (expression_list (interpreted_string_literal (escape_sequence))))
    (const_spec (identifier) (expression_list (interpreted_string_literal (escape_sequence))))))

============================================
Slice literals
============================================

package main

const s1 = []string{}

const s2 = []string{"hi"}

const s3 = []string{
  "hi",
  "hello",
}

---

(source_file
  (package_clause (package_identifier))
  (const_declaration (const_spec
    (identifier)
    (expression_list (composite_literal
      (slice_type (type_identifier))
      (literal_value)))))
  (const_declaration (const_spec
    (identifier)
    (expression_list (composite_literal
      (slice_type (type_identifier))
      (literal_value
        (element (interpreted_string_literal)))))))
  (const_declaration (const_spec
    (identifier)
    (expression_list (composite_literal
      (slice_type (type_identifier))
      (literal_value
        (element (interpreted_string_literal))
        (element (interpreted_string_literal))))))))

============================================
Array literals with implicit length
============================================

package main

const a1 = [...]int{1, 2, 3}

---

(source_file
  (package_clause (package_identifier))
  (const_declaration (const_spec
    (identifier)
    (expression_list (composite_literal
      (implicit_length_array_type (type_identifier))
      (literal_value
        (element (int_literal))
        (element (int_literal))
        (element (int_literal))))))))

============================================
Map literals
============================================

package main

const s = map[string]string{
  "hi": "hello",
  "bye": "goodbye",
}

---

(source_file
  (package_clause (package_identifier))
  (const_declaration (const_spec
    (identifier)
    (expression_list (composite_literal
      (map_type (type_identifier) (type_identifier))
      (literal_value
        (keyed_element (interpreted_string_literal) (interpreted_string_literal))
        (keyed_element (interpreted_string_literal) (interpreted_string_literal))))))))

============================================
Struct literals
============================================

package main

const s1 = Person{
  name: "Frank",
  Age: "5 months",
}

const s2 = struct{i int;}{i: 5}

const s3 = time.Time{}

---

(source_file
  (package_clause (package_identifier))
  (const_declaration (const_spec
    (identifier)
    (expression_list (composite_literal
      (type_identifier)
      (literal_value
        (keyed_element (field_identifier) (interpreted_string_literal))
        (keyed_element (field_identifier) (interpreted_string_literal)))))))
  (const_declaration (const_spec
    (identifier)
    (expression_list (composite_literal
      (struct_type (field_declaration_list
        (field_declaration (field_identifier) (type_identifier))))
      (literal_value
        (keyed_element (field_identifier) (int_literal)))))))
  (const_declaration (const_spec
    (identifier)
    (expression_list (composite_literal
      (qualified_type (package_identifier) (type_identifier))
      (literal_value))))))

============================================
Function literals
============================================

package main

const s1 = func(s string) (int, int) {
  return 1, 2
}

---

(source_file
  (package_clause (package_identifier))
  (const_declaration (const_spec
    (identifier)
    (expression_list
      (func_literal
        (parameter_list
          (parameter_declaration (identifier) (type_identifier)))
        (parameter_list
          (parameter_declaration (type_identifier))
          (parameter_declaration (type_identifier)))
        (block
          (return_statement (expression_list (int_literal) (int_literal)))))))))