🎯 Exemplos recomendados
Balanced sample collections from various categories for you to explore
Exemplos de Recursos Mobile Web Go
Exemplos de recursos específicos mobile Web Go incluindo informações do dispositivo, status da rede e vibração
💻 Informações do Dispositivo go
🟢 simple
⭐⭐⭐
Obter modelo do dispositivo, versão do SO e outras propriedades do dispositivo
⏱️ 25 min
🏷️ go, web, mobile features
Prerequisites:
Intermediate Go, os/exec, runtime
// Web Go Device Information Examples
// Get device information using system calls and environment variables
package main
import (
"fmt"
"os"
"os/exec"
"runtime"
"strings"
)
// 1. Basic Device Information
// DeviceInfo holds basic device information
type DeviceInfo struct {
OS string
Architecture string
Hostname string
CPUCount int
GoVersion string
}
// GetDeviceInfo gets basic device information
func GetDeviceInfo() DeviceInfo {
hostname, _ := os.Hostname()
return DeviceInfo{
OS: runtime.GOOS,
Architecture: runtime.GOARCH,
Hostname: hostname,
CPUCount: runtime.NumCPU(),
GoVersion: runtime.Version(),
}
}
// PrintDeviceInfo prints device information
func PrintDeviceInfo(info DeviceInfo) {
fmt.Println("=== Device Information ===")
fmt.Printf("OS: %s\n", info.OS)
fmt.Printf("Architecture: %s\n", info.Architecture)
fmt.Printf("Hostname: %s\n", info.Hostname)
fmt.Printf("CPU Count: %d\n", info.CPUCount)
fmt.Printf("Go Version: %s\n", info.GoVersion)
}
// 2. OS-Specific Information
// GetOSVersion gets OS version (platform-specific)
func GetOSVersion() string {
switch runtime.GOOS {
case "windows":
return getWindowsVersion()
case "darwin":
return getMacOSVersion()
case "linux":
return getLinuxVersion()
default:
return "Unknown OS"
}
}
func getWindowsVersion() string {
cmd := exec.Command("cmd", "ver")
output, err := cmd.Output()
if err != nil {
return "Windows (version unknown)"
}
return strings.TrimSpace(string(output))
}
func getMacOSVersion() string {
cmd := exec.Command("sw_vers", "-productVersion")
output, err := cmd.Output()
if err != nil {
return "macOS (version unknown)"
}
return fmt.Sprintf("macOS %s", strings.TrimSpace(string(output)))
}
func getLinuxVersion() string {
// Try /etc/os-release first
cmd := exec.Command("sh", "-c", "cat /etc/os-release | grep PRETTY_NAME")
output, err := cmd.Output()
if err == nil {
str := string(output)
if strings.Contains(str, "PRETTY_NAME=") {
parts := strings.Split(str, "=")
if len(parts) > 1 {
return strings.Trim(parts[1], ""\n")
}
}
}
// Fallback to uname
cmd = exec.Command("uname", "-r")
output, err = cmd.Output()
if err != nil {
return "Linux (version unknown)"
}
return fmt.Sprintf("Linux %s", strings.TrimSpace(string(output)))
}
// 3. Hardware Information
// MemoryInfo holds memory information
type MemoryInfo struct {
Total uint64
Available uint64
Used uint64
UsedPercent float64
}
// GetMemoryInfo gets memory information (platform-specific)
func GetMemoryInfo() MemoryInfo {
switch runtime.GOOS {
case "windows":
return getWindowsMemoryInfo()
case "darwin", "linux":
return getUnixMemoryInfo()
default:
return MemoryInfo{}
}
}
func getWindowsMemoryInfo() MemoryInfo {
// Use wmic or GetPerformanceInfo
cmd := exec.Command("wmic", "OS", "get", "TotalVisibleMemorySize,FreePhysicalMemory")
output, err := cmd.Output()
if err != nil {
return MemoryInfo{}
}
// Parse output (simplified)
lines := strings.Split(string(output), "\n")
if len(lines) < 2 {
return MemoryInfo{}
}
fields := strings.Fields(lines[1])
if len(fields) < 2 {
return MemoryInfo{}
}
// Values are in KB
var total, available uint64
fmt.Sscanf(fields[0], "%d", &total)
fmt.Sscanf(fields[1], "%d", &available)
total *= 1024 // Convert to bytes
available *= 1024
used := total - available
return MemoryInfo{
Total: total,
Available: available,
Used: used,
UsedPercent: float64(used) / float64(total) * 100,
}
}
func getUnixMemoryInfo() MemoryInfo {
// Read from /proc/meminfo on Linux
cmd := exec.Command("sh", "-c", "cat /proc/meminfo | grep -E 'MemTotal|MemAvailable'")
output, err := cmd.Output()
if err != nil {
return MemoryInfo{}
}
lines := strings.Split(string(output), "\n")
var total, available uint64
for _, line := range lines {
fields := strings.Fields(line)
if len(fields) >= 2 {
var value uint64
fmt.Sscanf(fields[1], "%d", &value)
value *= 1024 // Convert to bytes
if strings.Contains(line, "MemTotal") {
total = value
} else if strings.Contains(line, "MemAvailable") {
available = value
}
}
}
if total == 0 {
return MemoryInfo{}
}
used := total - available
return MemoryInfo{
Total: total,
Available: available,
Used: used,
UsedPercent: float64(used) / float64(total) * 100,
}
}
// FormatMemorySize formats memory size in human-readable format
func FormatMemorySize(bytes uint64) string {
const (
KB = 1024
MB = KB * 1024
GB = MB * 1024
)
switch {
case bytes >= GB:
return fmt.Sprintf("%.2f GB", float64(bytes)/float64(GB))
case bytes >= MB:
return fmt.Sprintf("%.2f MB", float64(bytes)/float64(MB))
case bytes >= KB:
return fmt.Sprintf("%.2f KB", float64(bytes)/float64(KB))
default:
return fmt.Sprintf("%d B", bytes)
}
}
// CPUInfo holds CPU information
type CPUInfo struct {
Model string
Cores int
Frequency string
}
// GetCPUInfo gets CPU information
func GetCPUInfo() CPUInfo {
info := CPUInfo{
Cores: runtime.NumCPU(),
}
switch runtime.GOOS {
case "windows":
info.Model = getWindowsCPUModel()
case "darwin":
info.Model = getMacOSCPUModel()
case "linux":
info.Model = getLinuxCPUModel()
}
return info
}
func getWindowsCPUModel() string {
cmd := exec.Command("wmic", "cpu", "get", "name")
output, err := cmd.Output()
if err != nil {
return "Unknown CPU"
}
lines := strings.Split(string(output), "\n")
if len(lines) > 1 {
return strings.TrimSpace(lines[1])
}
return "Unknown CPU"
}
func getMacOSCPUModel() string {
cmd := exec.Command("sysctl", "-n", "machdep.cpu.brand_string")
output, err := cmd.Output()
if err != nil {
return "Unknown CPU"
}
return strings.TrimSpace(string(output))
}
func getLinuxCPUModel() string {
cmd := exec.Command("sh", "-c", "cat /proc/cpuinfo | grep 'model name' | head -1")
output, err := cmd.Output()
if err != nil {
return "Unknown CPU"
}
str := string(output)
parts := strings.Split(str, ":")
if len(parts) > 1 {
return strings.TrimSpace(parts[1])
}
return "Unknown CPU"
}
// 4. Screen Information
// ScreenInfo holds screen/display information
type ScreenInfo struct {
Width int
Height int
DPI int
Orientation string
}
// GetScreenInfo gets screen information
func GetScreenInfo() ScreenInfo {
// This is platform-dependent and may require external libraries
// For web applications, you'd use JavaScript's window.screen
// Simulated values for demonstration
return ScreenInfo{
Width: 1920,
Height: 1080,
DPI: 96,
Orientation: "landscape",
}
}
// 5. Battery Information
// BatteryInfo holds battery information
type BatteryInfo struct {
Level int
Charging bool
TimeRemaining string
}
// GetBatteryInfo gets battery information (platform-specific)
func GetBatteryInfo() BatteryInfo {
switch runtime.GOOS {
case "darwin":
return getMacOSBatteryInfo()
case "linux":
return getLinuxBatteryInfo()
default:
return BatteryInfo{}
}
}
func getMacOSBatteryInfo() BatteryInfo {
cmd := exec.Command("pmset", "-g", "batt")
output, err := cmd.Output()
if err != nil {
return BatteryInfo{}
}
str := string(output)
info := BatteryInfo{}
// Parse battery percentage
if strings.Contains(str, "%") {
parts := strings.Fields(str)
for _, part := range parts {
if strings.Contains(part, "%") {
var percent int
fmt.Sscanf(part, "%d", &percent)
info.Level = percent
}
}
}
// Check if charging
info.Charging = strings.Contains(str, "AC Power")
return info
}
func getLinuxBatteryInfo() BatteryInfo {
// Read from /sys/class/power_supply/BAT0/
cmd := exec.Command("sh", "-c", "cat /sys/class/power_supply/BAT0/capacity")
output, err := cmd.Output()
if err != nil {
return BatteryInfo{}
}
var level int
fmt.Sscanf(strings.TrimSpace(string(output)), "%d", &level)
cmd = exec.Command("sh", "-c", "cat /sys/class/power_supply/BAT0/status")
statusOutput, _ := cmd.Output()
return BatteryInfo{
Level: level,
Charging: strings.Contains(string(statusOutput), "Charging"),
}
}
// 6. Application Information
// AppInfo holds application information
type AppInfo struct {
Name string
Version string
Build string
BuildDate string
Author string
}
// GetAppInfo gets application information
func GetAppInfo() AppInfo {
// These would typically come from build flags or config
return AppInfo{
Name: "My Go App",
Version: "1.0.0",
Build: "12345",
BuildDate: "2025-12-30",
Author: "Your Name",
}
}
// 7. Environment Information
// EnvironmentInfo holds environment information
type EnvironmentInfo struct {
Variables map[string]string
Path string
Home string
Terminal string
}
// GetEnvironmentInfo gets environment information
func GetEnvironmentInfo() EnvironmentInfo {
return EnvironmentInfo{
Variables: getSelectedEnvVars(),
Path: os.Getenv("PATH"),
Home: os.Getenv("HOME"),
Terminal: os.Getenv("TERM"),
}
}
func getSelectedEnvVars() map[string]string {
selected := []string{
"PATH", "HOME", "USER", "SHELL",
"APPDATA", "PROGRAMFILES", "TEMP",
"LANG", "LC_ALL",
}
result := make(map[string]string)
for _, key := range selected {
if value := os.Getenv(key); value != "" {
result[key] = value
}
}
return result
}
// 8. Device Identification
// DeviceID generates a unique device ID
func GetDeviceID() string {
hostname, _ := os.Hostname()
os := runtime.GOOS
arch := runtime.GOARCH
// Create a simple ID from available info
return fmt.Sprintf("%s-%s-%s", hostname, os, arch)
}
// GetFingerprint creates device fingerprint
func GetDeviceFingerprint() string {
info := GetDeviceInfo()
cpuInfo := GetCPUInfo()
return fmt.Sprintf("%s-%s-%d-%s",
info.OS,
info.Architecture,
info.CPUCount,
cpuInfo.Model,
)
}
// Usage Examples
func main() {
fmt.Println("=== Web Go Device Information Examples ===\n")
// 1. Basic device info
fmt.Println("--- 1. Basic Device Info ---")
deviceInfo := GetDeviceInfo()
PrintDeviceInfo(deviceInfo)
// 2. OS version
fmt.Println("\n--- 2. OS Version ---")
osVersion := GetOSVersion()
fmt.Printf("OS Version: %s\n", osVersion)
// 3. CPU info
fmt.Println("\n--- 3. CPU Information ---")
cpuInfo := GetCPUInfo()
fmt.Printf("CPU Model: %s\n", cpuInfo.Model)
fmt.Printf("CPU Cores: %d\n", cpuInfo.Cores)
// 4. Memory info
fmt.Println("\n--- 4. Memory Information ---")
memInfo := GetMemoryInfo()
fmt.Printf("Total Memory: %s\n", FormatMemorySize(memInfo.Total))
fmt.Printf("Available: %s\n", FormatMemorySize(memInfo.Available))
fmt.Printf("Used: %s (%.1f%%)\n",
FormatMemorySize(memInfo.Used),
memInfo.UsedPercent)
// 5. Screen info
fmt.Println("\n--- 5. Screen Information ---")
screenInfo := GetScreenInfo()
fmt.Printf("Resolution: %dx%d\n", screenInfo.Width, screenInfo.Height)
fmt.Printf("DPI: %d\n", screenInfo.DPI)
fmt.Printf("Orientation: %s\n", screenInfo.Orientation)
// 6. Battery info
fmt.Println("\n--- 6. Battery Information ---")
batteryInfo := GetBatteryInfo()
if batteryInfo.Level > 0 {
fmt.Printf("Battery Level: %d%%\n", batteryInfo.Level)
fmt.Printf("Charging: %v\n", batteryInfo.Charging)
} else {
fmt.Println("Battery information not available")
}
// 7. App info
fmt.Println("\n--- 7. Application Information ---")
appInfo := GetAppInfo()
fmt.Printf("App: %s v%s\n", appInfo.Name, appInfo.Version)
fmt.Printf("Build: %s (%s)\n", appInfo.Build, appInfo.BuildDate)
// 8. Device ID
fmt.Println("\n--- 8. Device Identification ---")
deviceID := GetDeviceID()
fmt.Printf("Device ID: %s\n", deviceID)
fingerprint := GetDeviceFingerprint()
fmt.Printf("Fingerprint: %s\n", fingerprint)
// 9. Environment
fmt.Println("\n--- 9. Environment ---")
envInfo := GetEnvironmentInfo()
fmt.Printf("Home: %s\n", envInfo.Home)
fmt.Printf("Terminal: %s\n", envInfo.Terminal)
fmt.Println("\n=== All Device Information Examples Completed ===")
}
💻 Status da Rede go
🟢 simple
⭐⭐⭐
Verificar status e tipo de conexão de rede
⏱️ 30 min
🏷️ go, web, mobile features
Prerequisites:
Intermediate Go, net package, os/exec
// Web Go Network Status Examples
// Check network connection status and type
package main
import (
"fmt"
"net"
"os/exec"
"runtime"
"strings"
"time"
)
// 1. Basic Network Status
// NetworkStatus holds network status information
type NetworkStatus struct {
Connected bool
Type string
IP string
Gateway string
DNS []string
Latency time.Duration
}
// GetNetworkStatus gets current network status
func GetNetworkStatus() NetworkStatus {
status := NetworkStatus{
Connected: false,
Type: "Unknown",
DNS: []string{},
}
// Check connectivity
if isNetworkAvailable() {
status.Connected = true
status.Type = detectNetworkType()
status.IP = getLocalIP()
status.Gateway = getDefaultGateway()
status.DNS = getDNSServers()
status.Latency = measureLatency()
}
return status
}
// isNetworkAvailable checks if network is available
func isNetworkAvailable() bool {
// Try to connect to a well-known server
_, err := net.DialTimeout("tcp", "8.8.8.8:53", 2*time.Second)
return err == nil
}
// detectNetworkType detects network connection type
func detectNetworkType() string {
// This is platform-specific
switch runtime.GOOS {
case "darwin":
return detectMacOSNetworkType()
case "linux":
return detectLinuxNetworkType()
case "windows":
return detectWindowsNetworkType()
default:
return "Ethernet"
}
}
func detectMacOSNetworkType() string {
cmd := exec.Command("networksetup", "-listallnetworkservices")
output, _ := cmd.Output()
str := string(output)
if strings.Contains(str, "Wi-Fi") || strings.Contains(str, "AirPort") {
return "Wi-Fi"
}
return "Ethernet"
}
func detectLinuxNetworkType() string {
// Check wireless interfaces
cmd := exec.Command("ls", "/sys/class/net")
output, _ := cmd.Output()
interfaces := strings.Split(string(output), "\n")
for _, iface := range interfaces {
if strings.HasPrefix(iface, "w") || strings.HasPrefix(iface, "wlan") {
return "Wi-Fi"
}
}
return "Ethernet"
}
func detectWindowsNetworkType() string {
cmd := exec.Command("netsh", "interface", "show", "interface")
output, _ := cmd.Output()
str := string(output)
if strings.Contains(str, "Wi-Fi") || strings.Contains(str, "Wireless") {
return "Wi-Fi"
}
return "Ethernet"
}
// getLocalIP gets local IP address
func getLocalIP() string {
conn, err := net.Dial("udp", "8.8.8.8:80")
if err != nil {
return "Unknown"
}
defer conn.Close()
localAddr := conn.LocalAddr().(*net.UDPAddr)
return localAddr.IP.String()
}
// getDefaultGateway gets default gateway
func getDefaultGateway() string {
switch runtime.GOOS {
case "darwin":
cmd := exec.Command("netstat", "-nr")
output, _ := cmd.Output()
lines := strings.Split(string(output), "\n")
for _, line := range lines {
if strings.Contains(line, "default") {
fields := strings.Fields(line)
if len(fields) > 1 {
return fields[1]
}
}
}
case "linux":
cmd := exec.Command("ip", "route")
output, _ := cmd.Output()
lines := strings.Split(string(output), "\n")
for _, line := range lines {
if strings.HasPrefix(line, "default") {
fields := strings.Fields(line)
if len(fields) > 2 {
return fields[2]
}
}
}
case "windows":
cmd := exec.Command("route", "print", "0.0.0.0")
output, _ := cmd.Output()
lines := strings.Split(string(output), "\n")
for _, line := range lines {
if strings.Contains(line, "0.0.0.0") {
fields := strings.Fields(line)
if len(fields) > 2 {
return fields[2]
}
}
}
}
return "Unknown"
}
// getDNSServers gets DNS servers
func getDNSServers() []string {
var dns []string
switch runtime.GOOS {
case "darwin":
cmd := exec.Command("scutil", "--dns")
output, _ := cmd.Output()
lines := strings.Split(string(output), "\n")
for _, line := range lines {
if strings.Contains(line, "nameserver") {
fields := strings.Fields(line)
if len(fields) > 1 {
dns = append(dns, fields[1])
}
}
}
case "linux":
cmd := exec.Command("cat", "/etc/resolv.conf")
output, _ := cmd.Output()
lines := strings.Split(string(output), "\n")
for _, line := range lines {
if strings.HasPrefix(line, "nameserver") {
fields := strings.Fields(line)
if len(fields) > 1 {
dns = append(dns, fields[1])
}
}
}
case "windows":
cmd := exec.Command("nslookup", "localhost")
output, _ := cmd.Output()
lines := strings.Split(string(output), "\n")
for _, line := range lines {
if strings.Contains(line, "Server:") {
fields := strings.Fields(line)
if len(fields) > 1 {
dns = append(dns, fields[1])
}
}
}
}
return dns
}
// measureLatency measures network latency
func measureLatency() time.Duration {
start := time.Now()
conn, err := net.DialTimeout("tcp", "8.8.8.8:53", 5*time.Second)
if err != nil {
return 0
}
defer conn.Close()
return time.Since(start)
}
// 2. Network Speed Test
// SpeedTestResult holds speed test results
type SpeedTestResult struct {
DownloadSpeed float64 // Mbps
UploadSpeed float64 // Mbps
Ping time.Duration
}
// RunSpeedTest runs network speed test
func RunSpeedTest() SpeedTestResult {
// Ping test
ping := measureLatency()
// Download speed (simplified - just measures time to download small file)
downloadSpeed := measureDownloadSpeed()
// Upload speed (simplified)
uploadSpeed := measureUploadSpeed()
return SpeedTestResult{
DownloadSpeed: downloadSpeed,
UploadSpeed: uploadSpeed,
Ping: ping,
}
}
func measureDownloadSpeed() float64 {
// Simplified download speed test
start := time.Now()
// Download small test file
// In real implementation, you'd download a larger file
conn, err := net.DialTimeout("tcp", "example.com:80", 5*time.Second)
if err != nil {
return 0
}
defer conn.Close()
elapsed := time.Since(start).Seconds()
if elapsed == 0 {
return 0
}
// Rough estimate (assuming ~1MB transfer)
sizeMB := 1.0
return sizeMB / elapsed
}
func measureUploadSpeed() float64 {
// Simplified upload speed test
start := time.Now()
conn, err := net.DialTimeout("tcp", "example.com:80", 5*time.Second)
if err != nil {
return 0
}
defer conn.Close()
// Write some data
data := make([]byte, 1024*1024) // 1MB
conn.Write(data)
elapsed := time.Since(start).Seconds()
if elapsed == 0 {
return 0
}
sizeMB := 1.0
return sizeMB / elapsed
}
// 3. Network Interface Information
// NetworkInterface holds interface information
type NetworkInterface struct {
Name string
IP string
Netmask string
MAC string
Up bool
Type string
}
// GetNetworkInterfaces gets all network interfaces
func GetNetworkInterfaces() []NetworkInterface {
var interfaces []NetworkInterface
ifaces, _ := net.Interfaces()
for _, iface := range ifaces {
addrs, _ := iface.Addrs()
var ip string
for _, addr := range addrs {
if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
ip = ipnet.IP.String()
break
}
}
}
ni := NetworkInterface{
Name: iface.Name,
IP: ip,
MAC: iface.HardwareAddr.String(),
Up: iface.Flags&net.FlagUp != 0,
}
// Detect interface type
if strings.Contains(iface.Name, "w") || strings.Contains(iface.Name, "Wi-Fi") {
ni.Type = "Wi-Fi"
} else if strings.Contains(iface.Name, "eth") || strings.Contains(iface.Name, "en") {
ni.Type = "Ethernet"
} else {
ni.Type = "Other"
}
interfaces = append(interfaces, ni)
}
return interfaces
}
// 4. Network Monitoring
// NetworkMonitor monitors network changes
type NetworkMonitor struct {
callback func(NetworkStatus)
stopChan chan bool
}
// NewNetworkMonitor creates network monitor
func NewNetworkMonitor(callback func(NetworkStatus)) *NetworkMonitor {
return &NetworkMonitor{
callback: callback,
stopChan: make(chan bool),
}
}
// Start starts monitoring network changes
func (nm *NetworkMonitor) Start(interval time.Duration) {
ticker := time.NewTicker(interval)
lastStatus := GetNetworkStatus()
go func() {
for {
select {
case <-ticker.C:
currentStatus := GetNetworkStatus()
// Check for changes
if currentStatus.Connected != lastStatus.Connected ||
currentStatus.Type != lastStatus.Type {
nm.callback(currentStatus)
lastStatus = currentStatus
}
case <-nm.stopChan:
ticker.Stop()
return
}
}
}()
}
// Stop stops monitoring
func (nm *NetworkMonitor) Stop() {
nm.stopChan <- true
}
// 5. Connectivity Check
// CheckConnectivity checks connectivity to specific host
func CheckConnectivity(host string, port int, timeout time.Duration) bool {
address := fmt.Sprintf("%s:%d", host, port)
conn, err := net.DialTimeout("tcp", address, timeout)
if err != nil {
return false
}
conn.Close()
return true
}
// CheckMultipleHosts checks connectivity to multiple hosts
func CheckMultipleHosts(hosts []string, timeout time.Duration) map[string]bool {
results := make(map[string]bool)
for _, host := range hosts {
results[host] = CheckConnectivity(host, 80, timeout)
}
return results
}
// 6. Network Statistics
// NetworkStats holds network statistics
type NetworkStats struct {
BytesSent uint64
BytesReceived uint64
PacketsSent uint64
PacketsReceived uint64
}
// GetNetworkStats gets network statistics (platform-specific)
func GetNetworkStats() NetworkStats {
// Platform-specific implementation
// This would typically read from /proc/net/dev on Linux
// or use performance counters on Windows
return NetworkStats{}
}
// Usage Examples
func main() {
fmt.Println("=== Web Go Network Status Examples ===\n")
// 1. Network status
fmt.Println("--- 1. Network Status ---")
status := GetNetworkStatus()
fmt.Printf("Connected: %v\n", status.Connected)
fmt.Printf("Type: %s\n", status.Type)
fmt.Printf("IP: %s\n", status.IP)
fmt.Printf("Gateway: %s\n", status.Gateway)
fmt.Printf("DNS: %v\n", status.DNS)
fmt.Printf("Latency: %v\n", status.Latency)
// 2. Network interfaces
fmt.Println("\n--- 2. Network Interfaces ---")
interfaces := GetNetworkInterfaces()
for _, iface := range interfaces {
if iface.Up && iface.IP != "" {
fmt.Printf("Interface: %s (%s)\n", iface.Name, iface.Type)
fmt.Printf(" IP: %s\n", iface.IP)
fmt.Printf(" MAC: %s\n", iface.MAC)
}
}
// 3. Speed test
fmt.Println("\n--- 3. Speed Test ---")
speedTest := RunSpeedTest()
fmt.Printf("Download: %.2f Mbps\n", speedTest.DownloadSpeed)
fmt.Printf("Upload: %.2f Mbps\n", speedTest.UploadSpeed)
fmt.Printf("Ping: %v\n", speedTest.Ping)
// 4. Connectivity check
fmt.Println("\n--- 4. Connectivity Check ---")
hosts := []string{"google.com", "github.com", "example.com"}
results := CheckMultipleHosts(hosts, 2*time.Second)
for host, connected := range results {
status := "✓"
if !connected {
status = "✗"
}
fmt.Printf("%s %s: %v\n", status, host, connected)
}
// 5. Network monitoring
fmt.Println("\n--- 5. Network Monitoring ---")
monitor := NewNetworkMonitor(func(status NetworkStatus) {
fmt.Printf("Network changed: Connected=%v, Type=%s\n",
status.Connected, status.Type)
})
fmt.Println("Monitoring network for 10 seconds...")
monitor.Start(2 * time.Second)
time.Sleep(10 * time.Second)
monitor.Stop()
fmt.Println("\n=== All Network Status Examples Completed ===")
}
💻 Vibração go
🟢 simple
⭐⭐⭐
Controlar vibração do dispositivo (suporte limitado, específico da plataforma)
⏱️ 20 min
🏷️ go, web, mobile features
Prerequisites:
Basic Go, time package
// Web Go Vibration Examples
// Control device vibration (platform-specific, limited support)
package main
import (
"fmt"
"os/exec"
"runtime"
"time"
)
// 1. Basic Vibration
// Vibrate vibrates the device for specified duration
func Vibrate(duration time.Duration) error {
switch runtime.GOOS {
case "darwin":
return vibrateMacOS(duration)
case "linux":
return vibrateLinux(duration)
case "windows":
return vibrateWindows(duration)
case "android":
return vibrateAndroid(duration)
default:
return fmt.Errorf("vibration not supported on %s", runtime.GOOS)
}
}
// vibrateMacOS vibrates on macOS (limited support)
func vibrateMacOS(duration time.Duration) error {
// macOS has limited vibration support
// Can use haptic feedback on trackpads or external devices
cmd := exec.Command("osascript", "-e",
`beep 1`)
return cmd.Run()
}
// vibrateLinux vibrates on Linux
func vibrateLinux(duration time.Duration) error {
// Check if vibration is available
if !hasVibrationSupport() {
return fmt.Errorf("vibration not available")
}
// Try using systemd-inhibit or other tools
// This is highly distribution-specific
cmd := exec.Command("notify-send", "-t",
fmt.Sprintf("%d", duration.Milliseconds()),
"Vibration", "Device vibrating")
return cmd.Run()
}
// vibrateWindows vibrates on Windows
func vibrateWindows(duration time.Duration) error {
// Windows doesn't have native vibration support
// Could use Xbox controller vibration or external APIs
return fmt.Errorf("vibration not supported on Windows")
}
// vibrateAndroid vibrates on Android
func vibrateAndroid(duration time.Duration) error {
// Would use JNI to call Android Vibrator API
// This requires Go Mobile or gomobile bindings
cmd := exec.Command("sh", "-c",
fmt.Sprintf("echo vibrate %d > /sys/class/timed_output/vibrator/enable",
duration.Milliseconds()))
return cmd.Run()
}
// hasVibrationSupport checks if vibration is available
func hasVibrationSupport() bool {
// Check for vibration device
_, err := exec.Command("ls", "/sys/class/timed_output/vibrator").Output()
return err == nil
}
// 2. Vibration Patterns
// VibrationPattern defines a vibration pattern
type VibrationPattern struct {
Durations []time.Duration
}
// NewVibrationPattern creates new vibration pattern
func NewVibrationPattern(durations ...time.Duration) VibrationPattern {
return VibrationPattern{
Durations: durations,
}
}
// Play plays the vibration pattern
func (vp VibrationPattern) Play() error {
for _, duration := range vp.Durations {
if err := Vibrate(duration); err != nil {
return err
}
time.Sleep(duration)
}
return nil
}
// Common vibration patterns
var (
// PatternTap short tap vibration
PatternTap = VibrationPattern{
Durations: []time.Duration{50 * time.Millisecond},
}
// PatternDoubleTap double tap vibration
PatternDoubleTap = VibrationPattern{
Durations: []time.Duration{
50 * time.Millisecond,
100 * time.Millisecond,
50 * time.Millisecond,
},
}
// PatternSuccess success notification pattern
PatternSuccess = VibrationPattern{
Durations: []time.Duration{
100 * time.Millisecond,
50 * time.Millisecond,
100 * time.Millisecond,
},
}
// PatternError error notification pattern
PatternError = VibrationPattern{
Durations: []time.Duration{
200 * time.Millisecond,
100 * time.Millisecond,
200 * time.Millisecond,
100 * time.Millisecond,
200 * time.Millisecond,
},
}
// PatternNotification notification pattern
PatternNotification = VibrationPattern{
Durations: []time.Duration{
100 * time.Millisecond,
50 * time.Millisecond,
100 * time.Millisecond,
50 * time.Millisecond,
100 * time.Millisecond,
},
}
)
// 3. Haptic Feedback
// HapticType defines type of haptic feedback
type HapticType int
const (
HapticImpactLight HapticType = iota
HapticImpactMedium
HapticImpactHeavy
HapticNotificationSuccess
HapticNotificationWarning
HapticNotificationError
HapticSelection
)
// HapticFeedback performs haptic feedback
func HapticFeedback(feedbackType HapticType) error {
switch feedbackType {
case HapticImpactLight:
return Vibrate(10 * time.Millisecond)
case HapticImpactMedium:
return Vibrate(25 * time.Millisecond)
case HapticImpactHeavy:
return Vibrate(50 * time.Millisecond)
case HapticNotificationSuccess:
return PatternSuccess.Play()
case HapticNotificationWarning:
return Vibrate(100 * time.Millisecond)
case HapticNotificationError:
return PatternError.Play()
case HapticSelection:
return Vibrate(15 * time.Millisecond)
default:
return fmt.Errorf("unknown haptic type")
}
}
// 4. Vibration Manager
// VibrationManager manages vibration operations
type VibrationManager struct {
enabled bool
intensity float64 // 0.0 to 1.0
current time.Duration
}
// NewVibrationManager creates vibration manager
func NewVibrationManager() *VibrationManager {
return &VibrationManager{
enabled: true,
intensity: 1.0,
}
}
// SetEnabled enables or disables vibration
func (vm *VibrationManager) SetEnabled(enabled bool) {
vm.enabled = enabled
}
// SetIntensity sets vibration intensity
func (vm *VibrationManager) SetIntensity(intensity float64) {
vm.intensity = intensity
}
// Vibrate vibrates with manager settings
func (vm *VibrationManager) Vibrate(duration time.Duration) error {
if !vm.enabled {
return nil
}
// Adjust duration by intensity
adjusted := time.Duration(float64(duration) * vm.intensity)
return Vibrate(adjusted)
}
// VibratePattern vibrates pattern with manager settings
func (vm *VibrationManager) VibratePattern(pattern VibrationPattern) error {
for _, duration := range pattern.Durations {
if err := vm.Vibrate(duration); err != nil {
return err
}
time.Sleep(duration)
}
return nil
}
// IsEnabled returns if vibration is enabled
func (vm *VibrationManager) IsEnabled() bool {
return vm.enabled
}
// GetIntensity returns current intensity
func (vm *VibrationManager) GetIntensity() float64 {
return vm.intensity
}
// 5. Vibration with Fallback
// VibrateWithFallback vibrates with visual fallback
func VibrateWithFallback(duration time.Duration, fallback func()) {
if err := Vibrate(duration); err != nil {
// Fallback to visual feedback
if fallback != nil {
fallback()
}
}
}
// 6. Feedback Combinations
// FeedbackType defines type of feedback
type FeedbackType int
const (
VisualFeedback FeedbackType = iota
HapticFeedback
AudioFeedback
CombinedFeedback
)
// Feedback provides combined feedback
func Feedback(feedbackType FeedbackType, message string) {
switch feedbackType {
case VisualFeedback:
fmt.Printf("[VISUAL] %s\n", message)
case HapticFeedback:
PatternTap.Play()
case AudioFeedback:
// Play sound
fmt.Printf("[AUDIO] %s\n", message)
case CombinedFeedback:
fmt.Printf("[COMBINED] %s\n", message)
PatternTap.Play()
}
}
// 7. Context-Aware Vibration
// VibrationContext defines vibration context
type VibrationContext struct {
IsSilent bool
IsImportant bool
UserPreference string
}
// ContextualVibrate vibrates based on context
func ContextualVibrate(context VibrationContext, pattern VibrationPattern) error {
// Check if should vibrate
if context.IsSilent && !context.IsImportant {
return nil // Don't vibrate in silent mode unless important
}
// Respect user preference
switch context.UserPreference {
case "always":
return pattern.Play()
case "never":
return nil
case "important_only":
if context.IsImportant {
return pattern.Play()
}
return nil
default:
return pattern.Play()
}
}
// 8. Vibration Scheduler
// VibrationScheduler schedules vibrations
type VibrationScheduler struct {
queues []VibrationTask
}
// VibrationTask represents a scheduled vibration
type VibrationTask struct {
Pattern VibrationPattern
Delay time.Duration
}
// NewVibrationScheduler creates vibration scheduler
func NewVibrationScheduler() *VibrationScheduler {
return &VibrationScheduler{
queues: []VibrationTask{},
}
}
// Schedule schedules a vibration
func (vs *VibrationScheduler) Schedule(pattern VibrationPattern, delay time.Duration) {
vs.queues = append(vs.queues, VibrationTask{
Pattern: pattern,
Delay: delay,
})
}
// Run executes scheduled vibrations
func (vs *VibrationScheduler) Run() {
for _, task := range vs.queues {
time.Sleep(task.Delay)
task.Pattern.Play()
}
vs.queues = []VibrationTask{}
}
// Usage Examples
func main() {
fmt.Println("=== Web Go Vibration Examples ===\n")
// 1. Basic vibration
fmt.Println("--- 1. Basic Vibration ---")
err := Vibrate(100 * time.Millisecond)
if err != nil {
fmt.Printf("Vibration error: %v\n", err)
fmt.Println("(Vibration may not be supported on this platform)")
}
// 2. Vibration patterns
fmt.Println("\n--- 2. Vibration Patterns ---")
fmt.Println("Playing tap pattern...")
PatternTap.Play()
time.Sleep(500 * time.Millisecond)
fmt.Println("Playing double tap pattern...")
PatternDoubleTap.Play()
time.Sleep(500 * time.Millisecond)
fmt.Println("Playing success pattern...")
PatternSuccess.Play()
// 3. Haptic feedback
fmt.Println("\n--- 3. Haptic Feedback ---")
HapticFeedback(HapticImpactLight)
time.Sleep(200 * time.Millisecond)
HapticFeedback(HapticImpactMedium)
time.Sleep(200 * time.Millisecond)
HapticFeedback(HapticImpactHeavy)
// 4. Vibration manager
fmt.Println("\n--- 4. Vibration Manager ---")
manager := NewVibrationManager()
manager.SetIntensity(0.5) // 50% intensity
fmt.Printf("Vibration enabled: %v\n", manager.IsEnabled())
fmt.Printf("Intensity: %.0f%%\n", manager.GetIntensity()*100)
manager.Vibrate(200 * time.Millisecond)
// 5. Context-aware vibration
fmt.Println("\n--- 5. Context-Aware Vibration ---")
context := VibrationContext{
IsSilent: false,
IsImportant: true,
UserPreference: "always",
}
ContextualVibrate(context, PatternNotification)
// 6. Scheduled vibrations
fmt.Println("\n--- 6. Scheduled Vibrations ---")
scheduler := NewVibrationScheduler()
scheduler.Schedule(PatternTap, 0)
scheduler.Schedule(PatternDoubleTap, 500*time.Millisecond)
scheduler.Schedule(PatternSuccess, 1000*time.Millisecond)
go scheduler.Run()
time.Sleep(2 * time.Second) // Wait for all vibrations
// 7. Fallback
fmt.Println("\n--- 7. Vibration with Fallback ---")
VibrateWithFallback(100*time.Millisecond, func() {
fmt.Println("[FALLBACK] Visual feedback instead of vibration")
})
// 8. Combined feedback
fmt.Println("\n--- 8. Combined Feedback ---")
Feedback(CombinedFeedback, "Operation successful")
fmt.Println("\n=== All Vibration Examples Completed ===")
fmt.Println("Note: Vibration support is platform-specific and limited")
fmt.Println("For mobile development, use Go Mobile (gomobile) or platform-specific APIs")
}