То, что вы хотите сделать, зависит от архитектуры, и Go не делает много, чтобы помочь вам определить порядок байтов вашего хоста, насколько я могу судить. Ваше решение с использованием небезопасных указателей, вероятно, лучше всего.
Если вам известен порядок байтов, в котором вы хотите поговорить и кодировать / декодировать соответственно, вы можете использовать пакет encoding/binary
для этого: https://godoc.org/encoding/binary#ByteOrder
Если вам действительно нужно полагаться на порядок байтов хоста, вы можете ударить головой по дизайну анти-шаблона, который вы следует стараться избегать, если это возможно: https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html
Также здесь говорится о энергичном обсуждении golang- орехи по этой теме, с мнениями, высказанными по обе стороны дискуссии: https://groups.google.com/forum/#!topic/golang-nuts/3GEzwKfRRQw
В этой электронной почте есть предложение Russ Cox просто статически определить желаемый порядок байтов (или порядок байтов хоста) с использованием ограничений сборки:
В течение нескольких месяцев наш код имел:
var hbo = binary.LittleEndian // hack - нам нужен порядок байтов хоста!
, поэтому мы n использовать encoding.Binary для чтения вещей.
Поместите это в файл с именем byteorder_amd64.go, и он перестает быть взломанным. Это не должно быть в стандартной библиотеке.
Надеюсь, что это поможет ...
Да, вы можете. Я не знаком с синтаксисом, который вы используете в настоящее время. Но с AspectJ было бы что-то вроде:
public aspect InterceptStringBuilders {
StringBuilder around(StringBuilder target) :
call(public StringBuilder append(String)) &&
!within(InterceptStringBuilders) &&
target(target)
{
if(target.length() == 0)
{
target.append("!!");
}
else if(target.length() == 1 || target.charAt(0) != '!' || target.charAt(1) != '!')
{
target.insert(0, "!!");
}
return proceed(target);
}
}
Точка соединения - public StringBuilder append(String)
, и вам нужен pointcut target
, чтобы выставить StringBuilder, чтобы вы могли принудительно установить, что он начинается с «!!». Кроме того, вам также нужен pointcut !within(interceptStringBuilders)
, чтобы гарантировать, что вы не перехватывает вызовы Stringbuilder из самого аспекта.
Я думаю, с синтаксисом, который вы используете, будет что-то похожее на:
"call(public StringBuilder append(String) && !within(LoggingAspect) && target(StringBuilder)"