@s_pyanov

Как вывести только заполненные строки из массива на html страницу в go?

Доброго времени суток всем.

Есть массив длиной в 1000 строк, есть БД из которой заполняются строки массива. В таблице бд строк пока что меньше чем размер массива. Если я вывожу массив размерностью в 1000 строк через конструкцию:
{{ range . }}
...                                            
  <td class=" ">{{ .Pacientid }}</td>
  <td class=" ">{{ .Tel}}</td>
{{ end }}

то генерируется вся 1000 строк, хотя данных у меня всего к примеру 10...
Пробовал использовать срезы, но объявлять срез приходится ранее и размер среза соответственно тоже - это не выход из положения(возможно я тут и ошибаюсь). Тогда встает вопрос как мне на этапе вывода html страницы сделать проверку не пустая ли строка? или как это лучше реализовать?
  • Вопрос задан
  • 349 просмотров
Решения вопроса 1
ibnteo
@ibnteo
В вашем случае срез надо объявлять нулевой длины, и резервировать память под предполагаемый размер (третий параметр make()):

patients := make([]Patient, 0, 1000)
//...
for row.Next() {
    var patient Patient
    row.Scan(&patient.Patientid, &patient.Tel)
    patients = append(patients, patient)
}


Здесь данных будет столько, сколько разместишь, и даже если их будет больше 1000, все поместятся в этот срез, просто он будет медленней работать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Размер среза необязательно объявлять заранее, можно использовать функцию append для того, чтобы добавлять элементы в срез, размер среза увеличивается автоматически при этом.
Или же можно вставить if в ваш шаблон для проверки на пустоту.
Ответ написан
@s_pyanov Автор вопроса
Всем спасибо!

Пока ждал ответа сделал так:
func getAllPacients(){ 			   //Соединение с БД
	var i int			   //Переменная для обхода масива
	i = 0
	db, err := sql.Open("mysql", username+":"+password+"@tcp("+server+":3306)/clinic") //Настраиваем соединение с БД
	rows,err :=db.Query("SELECT * FROM Pacient")				    //Выборка всех пациентов
	checkErr(err)//Проверяем отсутсвие ошибок

	tmp := pacientStruct{}
	Counter = conterQuey() // запрашиваем кол-во строк в таблице
	fmt.Println("Counter =",Counter)
	fmt.Println("=============================================================")
	for rows.Next() { 		    //получаем построчно информацию из запроса

		//Присваиваем значение переменным получая их их последовательно из интерфейса
		err = rows.Scan(&tmp.Id, &tmp.Pacientid, &tmp.FirstName, &tmp.LastName, &tmp.MiddleName, &tmp.Sex, &tmp.Birthday, &tmp.Tel, &tmp.Tel2, &tmp.Adress, &tmp.Email, &tmp.Whatsapp)
		checkErr(err) //проверяем на ошибку

		fmt.Print("RowScan = ")
			if len(PacientResultSlice) < Counter {
				PacientResultSlice = PacientResult[:Counter]
			}
			PacientResultSlice[i].Id=tmp.Id
			PacientResultSlice[i].Pacientid=tmp.Pacientid
			PacientResultSlice[i].FirstName=tmp.FirstName
			PacientResultSlice[i].LastName=tmp.LastName
			PacientResultSlice[i].MiddleName=tmp.MiddleName
			PacientResultSlice[i].Sex=tmp.Sex
			PacientResultSlice[i].Birthday=tmp.Birthday
			PacientResultSlice[i].Tel=tmp.Tel
			PacientResultSlice[i].Tel2=tmp.Tel2
			PacientResultSlice[i].Adress=tmp.Adress
			PacientResultSlice[i].Email=tmp.Email
			PacientResultSlice[i].Whatsapp=tmp.Whatsapp
			fmt.Print("PacientResultSlice[",i,"]= ",PacientResultSlice[i].Id)
			fmt.Print("  Длина PacientResultSlice = ",len(PacientResultSlice))
			fmt.Println(" | i = ", i, " ")
			i++

	}
	db.Close()	//Закрываем соединение с БД
}


может не особо элегантно, но работает...

по примеру Волька Ладошкин у меня при обновлении страницы слайс вырастает на размер себя + новая запись...

вот если подскажите как использовать правильно в моём случае пример Волька Ладошкин буду благодарен)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы