func readTags(path string) ([]tagLine, error) {
	f, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer f.Close()
	scanner := bufio.NewScanner(f)

	// Pass 1: Identify leading run of // comments and blank lines,
	// which must be followed by a blank line.
	var lines []string
	end := 0
	for scanner.Scan() {
		line := strings.TrimSpace(scanner.Text())
		if line == "" {
			end = len(lines)
			continue
		}
		if strings.HasPrefix(line, "//") {
			lines = append(lines, line[len("//"):])
			continue
		}
		break
	}
	if err := scanner.Err(); err != nil {
		return nil, err
	}
	lines = lines[:end]

	// Pass 2: Process each line in the run.
	var tagLines []tagLine
	for _, line := range lines {
		fields := strings.Fields(line)
		if len(fields) > 0 && fields[0] == "+build" {
			tagLines = append(tagLines, parseTagsInGroups(fields[1:]))
		}
	}
	return tagLines, nil
}
func readTags(path string) ([]tagLine, error) {
	f, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer f.Close()
	scanner := bufio.NewScanner(f)

	
	
	var lines []string
	end := 0
	for scanner.Scan() {
		line := strings.TrimSpace(scanner.Text())
		if line == "" {
			end = len(lines)
			continue
		}
		if strings.HasPrefix(line, "
			lines = append(lines, line[len("
			continue
		}
		break
	}
	if err := scanner.Err(); err != nil {
		return nil, err
	}
	lines = lines[:end]

	
	var tagLines []tagLine
	for _, line := range lines {
		fields := strings.Fields(line)
		if len(fields) > 0 && fields[0] == "+build" {
			tagLines = append(tagLines, parseTagsInGroups(fields[1:]))
		}
	}
	return tagLines, nil
}
func readTags ( path string ) ( [ ] tagLine , error ) { f , err := os . Open ( path ) if err != nil { return nil , err } defer f . Close ( ) scanner := bufio . NewScanner ( f ) // Pass 1: Identify leading run of // comments and blank lines, // which must be followed by a blank line. var lines [ ] string end := 0 for scanner . Scan ( ) { line := strings . TrimSpace ( scanner . Text ( ) ) if line == " " { end = len ( lines ) continue } if strings . HasPrefix ( line , " " ) { lines = append ( lines , line [ len ( " " ) : ] ) continue } break } if err := scanner . Err ( ) ; err != nil { return nil , err } lines = lines [ : end ] // Pass 2: Process each line in the run. var tagLines [ ] tagLine for _ , line := range lines { fields := strings . Fields ( line ) if len ( fields ) > 0 && fields [ 0 ] == " " { tagLines = append ( tagLines , parseTagsInGroups ( fields [ 1 : ] ) ) } } return tagLines , nil }
// readTags reads and extracts build tags from the block of comments
// and blank lines at the start of a file which is separated from the
// rest of the file by a blank line. Each string in the returned slice
// is the trimmed text of a line after a "+build" prefix.
// Based on go/build.Context.shouldBuild.
readTags reads and extracts build tags from the block of comments and blank lines at the start of a file which is separated from the rest of the file by a blank line . Each string in the returned slice is the trimmed text of a line after a + build prefix . Based on go / build . Context . shouldBuild .