Ответы пользователя по тегу Программирование
  • Как отсортировать структуру по произвольному полю?

    bitver
    @bitver
    Крч пригорело...
    Вот документация стандартной библиотеки: https://golang.org/pkg/sort/
    Вот выжимка, для особых:
    раз
    package main
    
    import (
    	"fmt"
    	"sort"
    )
    
    // A couple of type definitions to make the units clear.
    type earthMass float64
    type au float64
    
    // A Planet defines the properties of a solar system object.
    type Planet struct {
    	name     string
    	mass     earthMass
    	distance au
    }
    
    // By is the type of a "less" function that defines the ordering of its Planet arguments.
    type By func(p1, p2 *Planet) bool
    
    // Sort is a method on the function type, By, that sorts the argument slice according to the function.
    func (by By) Sort(planets []Planet) {
    	ps := &planetSorter{
    		planets: planets,
    		by:      by, // The Sort method's receiver is the function (closure) that defines the sort order.
    	}
    	sort.Sort(ps)
    }
    
    // planetSorter joins a By function and a slice of Planets to be sorted.
    type planetSorter struct {
    	planets []Planet
    	by      func(p1, p2 *Planet) bool // Closure used in the Less method.
    }
    
    // Len is part of sort.Interface.
    func (s *planetSorter) Len() int {
    	return len(s.planets)
    }
    
    // Swap is part of sort.Interface.
    func (s *planetSorter) Swap(i, j int) {
    	s.planets[i], s.planets[j] = s.planets[j], s.planets[i]
    }
    
    // Less is part of sort.Interface. It is implemented by calling the "by" closure in the sorter.
    func (s *planetSorter) Less(i, j int) bool {
    	return s.by(&s.planets[i], &s.planets[j])
    }
    
    var planets = []Planet{
    	{"Mercury", 0.055, 0.4},
    	{"Venus", 0.815, 0.7},
    	{"Earth", 1.0, 1.0},
    	{"Mars", 0.107, 1.5},
    }
    
    // ExampleSortKeys demonstrates a technique for sorting a struct type using programmable sort criteria.
    func main() {
    	// Closures that order the Planet structure.
    	name := func(p1, p2 *Planet) bool {
    		return p1.name < p2.name
    	}
    	mass := func(p1, p2 *Planet) bool {
    		return p1.mass < p2.mass
    	}
    	distance := func(p1, p2 *Planet) bool {
    		return p1.distance < p2.distance
    	}
    	decreasingDistance := func(p1, p2 *Planet) bool {
    		return !distance(p1, p2)
    	}
    
    	// Sort the planets by the various criteria.
    	By(name).Sort(planets)
    	fmt.Println("By name:", planets)
    
    	By(mass).Sort(planets)
    	fmt.Println("By mass:", planets)
    
    	By(distance).Sort(planets)
    	fmt.Println("By distance:", planets)
    
    	By(decreasingDistance).Sort(planets)
    	fmt.Println("By decreasing distance:", planets)
    
    }
    два!
    package main
    
    import (
    	"fmt"
    	"sort"
    )
    
    type Grams int
    
    func (g Grams) String() string { return fmt.Sprintf("%dg", int(g)) }
    
    type Organ struct {
    	Name   string
    	Weight Grams
    }
    
    type Organs []*Organ
    
    func (s Organs) Len() int      { return len(s) }
    func (s Organs) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
    
    // ByName implements sort.Interface by providing Less and using the Len and
    // Swap methods of the embedded Organs value.
    type ByName struct{ Organs }
    
    func (s ByName) Less(i, j int) bool { return s.Organs[i].Name < s.Organs[j].Name }
    
    // ByWeight implements sort.Interface by providing Less and using the Len and
    // Swap methods of the embedded Organs value.
    type ByWeight struct{ Organs }
    
    func (s ByWeight) Less(i, j int) bool { return s.Organs[i].Weight < s.Organs[j].Weight }
    
    func main() {
    	s := []*Organ{
    		{"brain", 1340},
    		{"heart", 290},
    		{"liver", 1494},
    		{"pancreas", 131},
    		{"prostate", 62},
    		{"spleen", 162},
    	}
    
    	sort.Sort(ByWeight{s})
    	fmt.Println("Organs by weight:")
    	printOrgans(s)
    
    	sort.Sort(ByName{s})
    	fmt.Println("Organs by name:")
    	printOrgans(s)
    
    }
    
    func printOrgans(s []*Organ) {
    	for _, o := range s {
    		fmt.Printf("%-8s (%v)\n", o.Name, o.Weight)
    	}
    }


    Если прям совсем чуда хотите - пишите через рефлексию. И это не совет, а крайний случай, никому бы не посоветовал её использовать.
    Ответ написан
    Комментировать
  • Стоит ли браться полному новичку за язык Go?

    bitver
    @bitver
    Для начала нормально, но без знания английского будет немного сложнее.
    Ответ написан
    Комментировать
  • Исходники каких PHP-проектов лучше поизучать для примера отличного PHP-кода?

    bitver
    @bitver
    PSR

    Больше ничего не надо, остальное только опытом нарабатывать.
    Ответ написан
    3 комментария
  • Какой путь у новичка в Go?

    bitver
    @bitver
    >>"Руки чешутся что-то начать делать"
    Что именно?) это главная проблема всех начинаний. Нужно задание, определенное, конкретное. Нужно чтоб был человек который требовал, да побыстрее...Нужна мотивация в виде плюшек или кнута, не иначе.
    Книги бессмысленно читать, если не понимаешь о чем они, к тому же они все одинаковые. Не понимаю для чего это печатается, когда в гугле 99% найдется, а оставшийся 1% если сам не додумаешь - то никто за тебя это не сделает.
    Это, конечно, не путь истинный, а мнение с которым, уверен, многие согласятся.
    Ответ написан
    Комментировать
  • Софт для организации музыки на компьютере?

    bitver
    @bitver
    Ищите медиа-сервер. Они умеют сортировать контент как угодно, их полно, на вкус и цвет...
    большим плюсом может оказаться DLNA или AirPlay если хочется ходить в наушниках по всему дому (в пределах досягаемости Wi-Fi) и не надо будет закачивать/удалять постоянно файлы на телефоне.
    А если хочется брать с собой музыку уходя из дома, то такие вещи обычно делают родные приложения компаний телефонов типа iTunes.
    Ответ написан
  • Как распредилить диапазон ip?

    bitver
    @bitver
    Для IPv4 конвертируем строковые IP в числа, а дальше простая арифметика. Например,
    play.golang.org/p/JlYJXZnUxl

    Для IPv6 нет встроенного типа uint128, но я уверен, что в нэте можно найти реализацию или из "С" либы (такое уж точно найдётся) переписать для Go.
    Ответ написан
    Комментировать
  • Как правильно работать со слайсами?

    bitver
    @bitver
    https://github.com/golang/go/wiki/SliceTricks
    Там описано всё что нужно)
    На счет структур...если нужно иметь возможность deep-copy обьектов, то придется писать что-то вроде конструктора копии (с++), только в Go нет такого, можно написать метод Copy(), который вернёт копию обьекта с новыми указателями, слайсами и новой выделенной под них память. play.golang.org/p/lr9vnTNp-J
    UPD: Самому понадобилось, нашёл https://godoc.org/code.google.com/p/rog-go/exp/deepcopy - универсальная реализация копирования.
    Ответ написан
    2 комментария