func (s *Section) RemoveKey(key string) {
	k, pos := s.getKey(key)
	if k != nil {
		s.file.lines = append(s.file.lines[:pos], s.file.lines[pos+1:]...)
		idx := 0
		for ; idx < len(s.keys); idx++ {
			if s.file.KeyCompFunc(key, s.keys[idx]) {
				break
			}
		}
		s.keys = append(s.keys[:idx], s.keys[idx+1:]...)
	}
}
RemoveKey removes a key and its value from Section.

If there is a comment on the line, it will not be removed.
package parser
import "fmt"
type Section struct {
	file *File
	pos position
	name    string
	ws      string
	comment *Comment
	keys []string
}
func NewSection(pos position, name, ws string, comment *Comment) *Section {
	var keys []string
	return &Section{
		pos: pos,
		name:    name,
		ws:      ws,
		comment: comment,
		keys: keys,
	}
}
func (s Section) String() string {
	comment := ""
	if s.comment != nil {
		comment = s.comment.String()
	}
	return fmt.Sprintf("[%s]%s%s", s.name, s.ws, comment)
}
func (s *Section) RawName() string {
	return s.name
}
func (s *Section) Name() string {
	return s.file.SectionNameFunc(s.name)
}
func (s *Section) RawKeys() []string {
	return s.keys
}
func (s *Section) Keys() []string {
	keys := make([]string, len(s.keys))
	for i, k := range s.keys {
		keys[i] = s.file.KeyManipFunc(k)
	}
	return keys
}
func (s *Section) getInsertLocation(idx int) int {
	for i := idx; i >= 0; i-- {
		if s.file.lines[i].item != nil {
			return i + 1
		}
	}
	return -1
}
func (s *Section) getKey(key string) (*KeyValuePair, int) {
	lastSectionName := ""
	for lastIdx, l := range s.file.lines {
		switch l.item.(type) {
		case *Section:
			if lastSectionName == s.name {
				return nil, s.getInsertLocation(lastIdx - 1)
			}
			sect, _ := l.item.(*Section)
			lastSectionName = sect.name
		case *KeyValuePair:
			kvp, _ := l.item.(*KeyValuePair)
			if lastSectionName == s.name && s.file.KeyCompFunc(kvp.key, key) {
				return kvp, lastIdx
			}
		}
	}
	return nil, s.getInsertLocation(len(s.file.lines) - 1)
}
func (s *Section) GetRaw(key string) string {
	k, _ := s.getKey(key)
	if k != nil {
		return k.value
	}
	return ""
}
func (s *Section) Get(key string) string {
	return s.file.ValueManipFunc(s.GetRaw(key))
}
func (s *Section) SetKeyValueRaw(key, value string) {
	k, pos := s.getKey(key)
	if k != nil {
		k.value = value
		return
	}
	ws := DefaultLeadingKeyWhitespace
	if s.name == "" {
		ws = ""
	}
	le := DefaultLineEnding
	if len(s.file.lines) > 0 {
		le = s.file.lines[0].le
	}
	k = NewKeyValuePair(position{}, key, "", value, nil)
	line := NewLine(position{}, ws, k, le)
	if pos < 0 {
		s.file.lines = append([]*Line{line}, s.file.lines...)
	} else {
		if _, ok := s.file.lines[pos-1].item.(*KeyValuePair); ok {
			line.ws = s.file.lines[pos-1].ws
		}
		s.file.lines = append(
			s.file.lines[:pos],
			append(
				[]*Line{line},
				s.file.lines[pos:]...,
			)...,
		)
	}
	s.keys = append(s.keys, k.key)
}
func (s *Section) SetKey(key, value string) {
	s.SetKeyValueRaw(s.file.KeyManipFunc(key), s.file.ValueManipFunc(value))
}