filepath.Ext не работает в termux

filepath.Ext() Использование этой функции срабатывает при использовании на ПК на любой ос, но выдает пустоту когда пытаюсь получить расширение файла в термуксе на андроид. В чем проблема может быть и какие ещё данные нужны для понимания? Код может быть любой, хоть

 log.Println(filepath.Ext(path))

в main.

Файл всегда один и тот же(я беру файл main.go моего проекта).

Может есть другой способ который даёт расширение всегда в любой ос.

UPD:

Проблема не в filepath.Ext а в mime.TypeByExtention. Именно эта функция дает путоту. filepath.Ext работает корректно

Посмотрел исходники как вообще реализовано определениие типа по расширению там это реализовано в виде мапы:

var builtinTypesLower = map[string]string{
    ".avif": "image/avif",
    ".css":  "text/css; charset=utf-8",
    ".gif":  "image/gif",
    ".htm":  "text/html; charset=utf-8",
    ".html": "text/html; charset=utf-8",
    ".jpeg": "image/jpeg",
    ".jpg":  "image/jpeg",
    ".js":   "text/javascript; charset=utf-8",
    ".json": "application/json",
    ".mjs":  "text/javascript; charset=utf-8",
    ".pdf":  "application/pdf",
    ".png":  "image/png",
    ".svg":  "image/svg+xml",
    ".wasm": "application/wasm",
    ".webp": "image/webp",
    ".xml":  "text/xml; charset=utf-8",
}

...и мне стало интреесно, а как же собственно, на остальных операционках определеяется тип данных файла, если в мапе исходников .go нет вовсе... Откуда mime.TypeByExtention берет text/x-go если такого расширения как .go нет в мапе в исходниках

UPD: не разобрался откуда typebyextension из пакета mime берет text/x-go для .go файлов. Оказалось что не обязательно для текстовых файлов указывать точный тип. Для текстовых файлов достаточно указать text/plain и они почти везде будут обрабатываться нормально. Поэтому для определения типа использую DetectContentType из пакета http. Gemini говорит что typebyExtension из пакета mime это алиас над detectContentType из net/http.

Для моего кейса, определять тип с помощью http.DetectContentType() оказалось достуточно.


Ответы (1 шт):

Автор решения: Pak Uula

Жаль что вы не привели минимально воспроизводимый пример. Из вашего примера совершенно неясно,откуда вы берёте path

Предположим, вы берёте его из os.Args. Но по какой-то неясной причине в Термуксе массив os.Args заполнен очень странно

package main

import (
    "log"
    "os"
    "path/filepath"
    "strings"
)

func main() {
    log.Println(strings.Join(os.Args, " "))
    if len(os.Args) == 1 {
        log.Fatal("missing argument")
    }
    path, err := filepath.Abs(os.Args[1])
    if err != nil {
        log.Fatal("failed to get absolute path", "path", os.Args[1], "error", err.Error())
    }
    log.Println(path)
    log.Println(filepath.Ext(path))
}

Программа выводит

~/zzz $ go build .
~/zzz $ ./zzz main.go
2024/11/03 18:33:47 ./zzz /data/data/com.termux/files/home/zzz/zzz main.go
2024/11/03 18:33:47 /data/data/com.termux/files/home/zzz/zzz
2024/11/03 18:33:47

В первой строчке напечатан массив os.Args:

os.Args[0] == ./zzz
os.Args[1] == /data/data/com.termux/files/home/zzz/zzz 
os.Args[2] == main.go

Если брать file.Ext(os.Args[1]),то результат действительно будет пустой строкой. Но если выполнить file.Ext(os.Args[2]), то вернёт, как полагается, .go.

→ Ссылка