Мы можем получить список файлов внутри папки в файловой системе, используя различные стандартные библиотечные функции golang.
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"path/filepath"
)
func main() {
var (
root string
files []string
err error
)
root := "/home/manigandan/golang/samples"
// filepath.Walk
files, err = FilePathWalkDir(root)
if err != nil {
panic(err)
}
// ioutil.ReadDir
files, err = IOReadDir(root)
if err != nil {
panic(err)
}
//os.File.Readdir
files, err = OSReadDir(root)
if err != nil {
panic(err)
}
for _, file := range files {
fmt.Println(file)
}
}
Пакет
blockquote>path/filepath
предоставляет удобный способ сканирования всех файлов в каталоге, он автоматически сканирует каждый подкаталог в каталоге.func FilePathWalkDir(root string) ([]string, error) { var files []string err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { if !info.IsDir() { files = append(files, path) } return nil }) return files, err }
- Использование ioutil.ReadDir
blockquote>
ioutil.ReadDir
читает каталог с именем dirname и возвращает список записей в каталоге, отсортированных по имени файла.func IOReadDir(root string) ([]string, error) { var files []string fileInfo, err := ioutil.ReadDir(root) if err != nil { return files, err } for _, file := range fileInfo { files = append(files, file.Name()) } return files, nil }
- Использование os.File .Readdir
Readdir считывает содержимое каталога, связанного с файлом, и возвращает срез до n значений FileInfo, как было бы возвращено Lstat, в порядке каталога. Последующие вызовы в том же файле приведут к дальнейшему FileInfos.
blockquote>func OSReadDir(root string) ([]string, error) { var files []string f, err := os.Open(root) if err != nil { return files, err } fileInfo, err := f.Readdir(-1) f.Close() if err != nil { return files, err } for _, file := range fileInfo { files = append(files, file.Name()) } return files, nil }
Результаты теста.
Получить подробнее об этом сообщении в блоге
Потому что вы передаете копию указателя. Чтобы изменить указатель, вам нужно что-то вроде этого:
void foo(int **ptr) //pointer to pointer
{
*ptr = new int[10]; //just for example, use RAII in a real world
}
или
void bar(int *& ptr) //reference to pointer (a bit confusing look)
{
ptr = new int[10];
}
, если вы пишете
int b = 0;
foo(b);
int foo(int a)
{
a = 1;
}
, вы не меняете 'b', потому что a является копией b
, если вы хотите изменить b, вам нужно будет передать адрес из b
int b = 0;
foo(&b);
int foo(int *a)
{
*a = 1;
}
одинаково для указателей:
int* b = 0;
foo(b);
int foo(int* a)
{
a = malloc(10); // here you are just changing
// what the copy of b is pointing to,
// not what b is pointing to
}
, поэтому для изменения, где b указывает, чтобы передать адрес:
int* b = 0;
foo(&b);
int foo(int** a)
{
*a = 1; // here you changing what b is pointing to
}
hth
Вы не можете изменить указатель, если вы не передадите его ссылкой (не const) или как двойной указатель. Передача по значению делает копию объекта, и любые изменения в объекте производятся копией, а не объектом. Вы можете изменить объект, на который указывает указатель, но не сам указатель, если вы проходите по значению.
Прочитайте этот вопрос, чтобы лучше понять различия в деталях . Когда пройти мимо ссылку и когда передать указатель в C ++?
Вы передаете указатель по значению.
Передайте ссылку на указатель, если вы хотите его обновить.
bool clickOnBubble(sf::Vector2i& mousePos, std::vector<Bubble *> bubbles, Bubble *& t)
*targetBubble = bubbles[i];
, и я передаю такой аргументclickOnBubble(mousePos, bubbles, &targetBubble);
– c0ntrol 7 August 2012 в 10:28